如何在VB.NET中检查TCP服务器(Socket)与TCP客户端的连接状态

cqoc49vn  于 2022-12-24  发布在  .NET
关注(0)|答案(2)|浏览(588)

近一个星期,我正在阅读,并试图找到一个解决方案,检查连接状态使用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
goqiplq2

goqiplq21#

系统通常通过实现一个“心跳”机制来处理这类问题,客户端定期向服务器发送一个“你还活着吗”的请求。有没有什么便宜的、非破坏性的请求可以定期发送到服务器,让你确保套接字实际上是活着的?

dly7yett

dly7yett2#

这是我很长一段时间以来一直在努力解决的问题,但从来没有找到一个全面的解决方案。不幸的是,没有一个100%可靠的方法,这就是为什么大多数系统都实现了“心跳”(正如Steve汤森提到的)。
我能得到的最接近的结果是这样的(通过内存从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

我不知道你的设置,但你提到你连接到一个规模。也许你可以尝试阅读它的重量定期作为一种形式的'心跳'。

相关问题