2

近一个星期以来,我正在阅读并试图找到使用 TCP 客户端(使用套接字类)检查连接状态的解决方案在我的场景中,我有一个连接到服务器的 TCP 客户端(它不受我控制),我希望不时检查连接状态,并在必要时重新连接。我在互联网上阅读了很多信息,但我没有找到合适的解决方案。

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

我可以请遇到此问题的人帮助我吗?

1.示例来自 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.使用投票的例子

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.使用投票

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
4

2 回答 2

0

系统通常通过实现“心跳”机制来处理此类问题,在该机制中,客户端定期向服务器发送“你还活着”请求。是否有任何廉价的、非破坏性的请求可以定期发送到服务器,以确保套接字实际上是活动的?

于 2012-04-23T14:08:40.933 回答
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

我不完全了解您的设置,但您提到您正在连接到秤。也许您可以尝试定期读取它的重量作为“心跳”的一种形式。

于 2016-03-15T20:57:41.087 回答