ほぼ1週間、TCPクライアントを使用して(ソケットクラスを使用して)接続状態をチェックするための解決策を読んで見つけようとしています。私のシナリオでは、サーバーに接続されているTCPクライアントがあります(私によって制御されていません)。ときどき接続状態を確認し、必要に応じて再接続する必要があります。インターネットで多くの情報を読みましたが、適切な解決策が見つかりませんでした。
簡単に言えば、これらは私がインターネットで見つけて実装しようとしている方法です。しかし残念なことに、TCP サーバーが閉じられていて、TCP クライアントがまだ 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