2012-04-23 89 views
2

近一周我正在阅读并试图找到使用TCP客户端检查连接状态的解决方案(使用套接字类) 在我的情况下,我有一个连接到服务器的TCP客户端(它不受我控制),我不时要检查连接状态,并在必要时重新连接。 我已经阅读了很多互联网上的信息,但我没有找到合适的解决方案。如何在VB.NET中使用TCP客户端检查TCP服务器(套接字)的连接状态

简而言之,这些是我在互联网上找到并尝试实施的方法。 但是不幸的是,我发现了一些TCP服务器关闭的情况,TCP客户端仍在说连接

请问有人遇到过这个问题可以帮我吗?使用轮询

Function Connected() As Boolean 
    Connected = False 
    If (tcpSocket.Connected) Then 
     If ((tcpSocket.Poll(0, SelectMode.SelectWrite)) AndAlso (Not tcpSocket.Poll(0, SelectMode.SelectError))) Then 
      Dim b As Byte() = New Byte(1) {} 
      If tcpSocket.Receive(b, SocketFlags.Peek) = 0 Then 
       Return False 
      Else : Return True 
      End If 
     Else 
      Return False 
     End If 
    Else 
     Return False 

    End If 
End Function 

3,采用轮询

从MSDN

Private Function IsConnected(tcpSocket As Socket) As Boolean 
    Dim blockingState As Boolean = tcpSocket.Blocking 
    IsConnected = False 
    Try 
     Dim tmp(0) As Byte 
     tcpSocket.Blocking = False 
     tcpSocket.Send(tmp, 0, 0) 
     Return True 
    Catch e As SocketException 
     If e.NativeErrorCode.Equals(10035) Then 
      Return True 
     Else : Return False 
     End If 
     ThrowError(e) 
    Finally 
     tcpSocket.Blocking = blockingState 
    End Try 
End Function 

2.Example

1.Example

Private Function Connect2() As Boolean 
     Connect2 = False 
     If tcpSocket.Poll(0, SelectMode.SelectRead) = True Then 
      Dim byteArray As Byte() = New Byte(1) {} 
      If (tcpSocket.Receive(byteArray, SocketFlags.Peek)) = 0 Then Connect2 = True 
     End If 
     Return Connect2() 
End Function 
+0

原则上没有可靠的方法来知道连接是否仍然可用而不从远程端接收值。中间的网络可能只是一个黑洞,你永远不知道没有收到什么东西。 – usr 2014-10-08 07:56:33

回答

0

系统往往通过实施处理这种问题“心跳“机制,客户端定期向服务器发送”你还活着“的请求。是否有任何廉价的非破坏性请求可以定期发送给服务器,以便确保套接字实际上是活着的?

+0

老实说,我不知道...我也找到一个有关TCPAlive的方法http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/d5b6ae25-eac8-4e3d-9782-53059de04628 /但我不知道如何使用它... – Operagust 2012-04-23 15:44:40

+0

你的服务器执行什么功能?也许有一种“获得状态”的电话,你可以每隔一段时间做一次 – 2012-04-23 15:59:33

+0

因此,服务器是一个规模(有一个IP和端口)...我的TCP客户端连接到规模,并试图读取一些数据...时不时我想检查与量表的连接是否仍然打开... – Operagust 2012-04-23 16:17:51

0

这是我奋斗了一段时间,从未真正找到一个全面解决方案。不幸的是,没有100%可靠的方法,这就是为什么大多数系统实施“心跳”(正如Steve Townsend所述)。

我能得到的最接近的是像这样(受内存从C#翻译):

Public Function IsConnected() as Boolean 
    Try 
     Return tcpSocket <> Nothing AndAlso Not(tcpSocket.Poll(-1, SelectMode.SelectRead) _ 
       AndAlso tcpSocket.Available = 0) 
    Catch (ObjectDisposedException) 
     Return False 
    End Try 
End Function 

我不知道你的确切设置,但你提到你要连接到一个规模。也许你可以试着把它的重量定期作为“心跳”的一种形式来读取。

相关问题