我试图通过TCP/IP连接到一块硬件。我在VB中做得非常顺利,并试图在C#中实现相同的结果。C#:套接字问题 - 几秒钟后连接的套接字断开连接
的代码看起来是这样的:
internal Socket connectSocket(IPEndPoint vIPEndPoint)
{
Socket lclSocket = new Socket(vIPEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
lclSocket.Connect(vIPEndPoint);
}
catch (Exception ex)
{
}
if (lclSocket.Connected)
{
string str = receiveResponse(lclSocket);
if (str.Contains(PFCommonVariables.m_strCommandDelimiter))
{
_sockets.Add(vIPEndPoint, lclSocket);
}
else
{
lclSocket.Disconnect(true);
}
}
lclSocket.ReceiveTimeout = RECEIVE_TIMEOUT;
lclSocket.SendTimeout = SEND_TIMEOUT;
return lclSocket;
}
正如我所说的,这个代码是完全一样的VB代码,在那里我可以保持一个成功的连接。在C#中的问题在于,在我对IPEndPoint进行的'socket.Connect'调用之后,Connected属性显示为True。我也验证了通过Wireshark成功发送和接收数据。然后,我在if(lclSocket.Connected)语句中放置了一个断点。当我第一次来到这里时,关联属性仍然为True。但是,如果我在此处等待1-2秒而未做任何事情,则关联属性将变为false。
因此,连接自动丢失。然后,如果我打开调试器并等待一条线路,那么在Wireshark中,我会看到许多Keep-Alive TCP消息经常在PC和硬件之间来回发送。我不是起诉这些是什么,但他们可能有助于诊断问题...
不,远程终端是'愚蠢的',因为它不检查任何响应或超时。个人电脑应保持连接,直到断开呼叫。代码的VB版本完全相同,其工作方式与预期相同,不会断开连接。也似乎没有数据包发送表明断开连接。 – sbenderli 2009-08-28 16:32:27