如何在 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套接字当网络中断时或服务器意外关机,客户端如何自动重新连接服务端