2

タイマーを実行して切断された接続をチェックするために、TCP キープアライブを実装したいと考えています。

私の場合、TCP クライアント (ソケット クラスを使用) とサード パーティ サーバー (私はそれを制御できません) があります。接続状態を確認するために、TCP クライアントで TCP KeepAlive を使用するにはどうすればよいですか?

とりあえず、TCP キープアライブ オプションを有効にしました。

tcpsocket.Connect(IPEndPoint)
tcpSocket.SetSocketOption(SocketOptionLevel.Tcp,SocketOptionName.KeepAlive,1);

インターネットで検索すると、この手順が機能することがわかりましたが、TCP クライアントでどのように使用できるのでしょうか?

Private Shared Function SetKeepAlive(ByRef tcpSocket As Socket, ByVal keepAliveTime As UInteger, ByVal keepAliveInterval As UInteger) As Boolean
  ' Pack three params into 12-element byte array; not sure about endian issues on non-Intel
  Dim SIO_KEEPALIVE_VALS(11) As Byte
  Dim keepAliveEnable As UInteger = 1
  If (keepAliveTime = 0 Or keepAliveInterval = 0) Then keepAliveEnable = 0
  ' Bytes 00-03 are 'enable' where '1' is true, '0' is false
  ' Bytes 04-07 are 'time' in milliseconds
  ' Bytes 08-12 are 'interval' in milliseconds
  Array.Copy(BitConverter.GetBytes(keepAliveEnable),  0, SIO_KEEPALIVE_VALS, 0, 4)
  Array.Copy(BitConverter.GetBytes(keepAliveTime),   0, SIO_KEEPALIVE_VALS, 4, 4)
  Array.Copy(BitConverter.GetBytes(keepAliveInterval), 0, SIO_KEEPALIVE_VALS, 8, 4)

  Try
   Dim result() As Byte = BitConverter.GetBytes(CUInt(0)) ' Result needs 4-element byte array?
   tcpSocket.IOControl(IOControlCode.KeepAliveValues, SIO_KEEPALIVE_VALS, result)
  Catch e As Exception
   Return False
  End Try
  Return True
 End Function

どんな助けでも大歓迎です。

PS: 私はプログラミングが初めてなので、コーディングの間違いをお許しください。

4

1 に答える 1

2

最後に、TCP キープアライブを使用することができました。したがって、これを実装するために、mainform_load プロシージャで呼び出しました。

        tcpSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, True)
        SetKeepAlive(tcpSocket, keepalivetime, keepaliveinterval)
        Try
            tcpSocket.Connect(ipEndPoint)
        Catch e As SocketException
            ...
        End Try

WireShark で確認したところ、送信されたパッケージに気付きました。

于 2012-04-25T08:08:33.637 に答える