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

Posted

技术标签:

【中文标题】如何在 VB.NET 中检查 TCP 服务器(套接字)与 TCP 客户端的连接状态【英文标题】:How to check the connection state of a TCP Server (Socket) with TCP Client in VB.NET 【发布时间】:2012-05-04 03:04:40 【问题描述】:

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

简而言之,这些是我在互联网上找到并尝试实施的方法。 但不幸的是,我发现了一些 TCP Server 关闭并且 TCP Client 仍然说 Connected 的场景

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

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

【问题讨论】:

原则上没有可靠的方法来知道如果没有从远程端接收到值,连接是否仍然可用。两者之间的网络可能只是一个黑洞,如果没有收到任何东西,你永远不会知道。 【参考方案1】:

这是我很长一段时间以来一直在努力解决的问题,但从未真正找到一个包罗万象的解决方案。不幸的是,没有 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

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

【讨论】:

【参考方案2】:

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

【讨论】:

老实说我不知道​​...我也找到了关于 TCPAlive social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/… 的方法,但我不知道如何使用它... 您的服务器执行什么功能?也许你可以经常调用某种“获取状态”来调用它 所以服务器是一个秤(有一个 ip 和端口)...我的 TCP 客户端连接到秤并试图读取一些数据...有时我想检查是否与秤的连接仍处于打开状态...

以上是关于如何在 VB.NET 中检查 TCP 服务器(套接字)与 TCP 客户端的连接状态的主要内容,如果未能解决你的问题,请参考以下文章

vb2010 (vb.net )Socket套接字当网络中断时或服务器意外关机,客户端如何自动重新连接服务端

套接字多连接 VB.NET

TCP套接字服务器如何判断从客户端接收到的数据何时完成?

vb.net如何使用TCP/IP协议向服务器发送字符串,要用到啥控件和函数?

如何在 VB.NET 中检查 Null 值

如何检查 VB.NET 代码中 Access SysCmd 失败的原因?