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
。
我真的不知道发生了什么事,我会感激你的帮助。
我注意到你正在做一个Socket。连接,但不做Socket.Disconnect。
来自MSDN网站Socket。断开连接将允许重用套接字并关闭连接。
Socket和Socket处理没有任何问题。错误信息有点误导。问题出在服务器端。
更多细节…
在第二次迭代中发送无效数据,当我尝试发送与第一次迭代完全相同的数据时,它也失败了,因为对于每个请求,服务器需要一个唯一的Guid
id。Guid
是在循环之外生成的,因此它被用于迭代中的所有项。重新启动进程是有效的,因为这样我将获得第一次迭代的新Guid
。