我有一个静态方法
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
。
我不确定发生了什么,并希望得到任何帮助。
答案 0 :(得分:0)
我注意到你正在做一个Socket.Connect,但从未做过Socket.Disconnect。
从MSDN网站Socket.Disconnect将允许重用套接字并关闭连接。
答案 1 :(得分:0)
Socket和Socket处理没有任何问题。错误消息有点误导。问题发生在服务器端。
更多细节......
第二次迭代时发送的数据无效,当我尝试发送与第一次迭代完全相同的数据时,它也失败了,因为对于每个请求,服务器都需要一个唯一的Guid
id。在循环外生成Guid
因此它被用于迭代中的所有项目。重启过程正在运行,因为我会在第一次迭代时得到一个新的Guid
。