2009-08-28 239 views
0

我試圖通過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和硬件之間來回發送。我不是起訴這些是什麼,但他們可能有助於診斷問題...

回答

0

我一直在深入挖掘這個,看起來Socket類的Connected屬性並不一定會返回我們期望的值。我發現了一個類似的帖子在這裏:

http://bytes.com/topic/c-sharp/answers/258127-how-use-socket-connected-property-properly

看來,有可能是半開的狀態,我懷疑我在當我嘗試接收發送郵件的問題發生。硬件。該消息確實來了,但是,我的接收循環不會因另一個問題而終止。但是,由於硬件發送了消息,我相信TCP協議假定連接處於暫停狀態,並將Connected屬性設置爲false。

我認爲這種情況在VB中完全一樣,但由於我的接收函數workek在那裏正確,我從未觀察到連接屬性中的更改。當socket.Connected爲false時,應該仍然可以發送消息。值得檢查。

0

當您在lclSocket.Connected行放置斷點時,您連接到服務器。此時,服務器將根據您的以下代碼向您發送連接響應。您的服務器是否會因爲沒有足夠的時間響應該響應而斷開連接?

另外對於tcp流量,您可能需要查看tcpclient類。

+0

不,遠程終端是'愚蠢的',因爲它不檢查任何響應或超時。個人電腦應保持連接,直到斷開呼叫。代碼的VB版本完全相同,其工作方式與預期相同,不會斷開連接。也似乎沒有數據包發送表明斷開連接。 – sbenderli 2009-08-28 16:32:27