2009-08-28 219 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