2

ほぼ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
4

2 に答える 2

0

多くの場合、システムは、クライアントがサーバーに「are you alive」要求を定期的に送信する「ハートビート」メカニズムを実装することによって、この種の問題を処理します。ソケットが実際に有効であることを確認できる、定期的にサーバーに送信できる安価で非破壊的なリクエストはありますか?

于 2012-04-23T14:08:40.933 に答える