TCP套接字未正确关闭处理

本文关键字:处理 套接字 TCP | 更新日期: 2023-09-27 18:10:42

我有一个静态方法

public class TelnetClient
{
    public static string SendAndReceiveData2(string data, string HostIPAddress, int Port)
    {
        using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            socket.Connect(HostIPAddress, Port);
            byte[] bytesToSend = Encoding.ASCII.GetBytes(data);
            socket.ReceiveTimeout = 3000;
            socket.SendTimeout = 3000;
            int bytesSent = socket.Send(bytesToSend);
            if (bytesSent != bytesToSend.Length)
            {
                throw new Exception("Invalid send byte number");
            }

            byte[] bytesReceiveBuffer = new byte[1024];
            int bytesRec = socket.Receive(bytesReceiveBuffer); //No need to loop for testing
            string returnedData = Encoding.ASCII.GetString(bytesReceiveBuffer, 0, bytesRec);
            socket.Close(); // Just out of desperation
            socket.Dispose();
            return returnedData;
        }
    }
 }

我是这样称呼它的

for (int i = 0; i < 10; i++)
{
    TelnetClient.SendAndReceiveData2("some data different each time", "127.0.0.1", 1234);
}

我在循环中调用这个方法。该方法向第三方应用程序发送一些命令,第三方应用程序立即返回响应。问题是,这段代码在第一次迭代中工作,但在第二次迭代中,它在socket.Receive失败,错误:

连接尝试失败,因为被连接的一方没有适当的响应一段时间后,或建立连接失败,因为连接的主机没有响应。

这里是棘手的部分,如果不是循环多次,我关闭exe并通过命令提示符重新启动,我不会得到错误,第三方应用程序也会收到多个请求。

这让我相信套接字在循环中没有得到正确的处理。但是如果我关闭这个进程并重新开始,就没有问题了。

我检查了socket.LocalEndPoint每次指向不同的端口。在第二次迭代时,socket.Available也被设置为0

我真的不知道发生了什么事,我会感激你的帮助。

TCP套接字未正确关闭处理

我注意到你正在做一个Socket。连接,但不做Socket.Disconnect。

来自MSDN网站Socket。断开连接将允许重用套接字并关闭连接。

Socket和Socket处理没有任何问题。错误信息有点误导。问题出在服务器端。

更多细节…

在第二次迭代中发送无效数据,当我尝试发送与第一次迭代完全相同的数据时,它也失败了,因为对于每个请求,服务器需要一个唯一的Guid id。Guid是在循环之外生成的,因此它被用于迭代中的所有项。重新启动进程是有效的,因为这样我将获得第一次迭代的新Guid