我試圖通過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