2012-04-24 6 views
2

Я хочу реализовать TCP KeepAlive, чтобы проверить сброшенные соединения, запустив таймер.Как реализовать TCP KeepAlive в VB.NET на TCP-сервере (сокет)

В моем случае у меня есть TCP-клиент (с использованием класса сокетов) и сторонний сервер (у меня нет контроля над ним). Как я могу использовать TCP KeepAlive на моем TCP-клиенте, чтобы проверить состояние подключения?

На данный момент я включил опцию TCP KeepAlive!

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

Поиск в Интернете я нашел эту процедуру, которая должна работать, но я задаюсь вопросом, как я могу использовать его в моем TCP Client?

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: Я новичок в программировании, поэтому, пожалуйста, извините меня за мои ошибки в кодировании.

ответ

2

Наконец-то мне удалось использовать TCP KeepAlive. Так что для того, чтобы реализовать это я только что назвал в процедуре 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 и я заметил, отправленные пакеты.

Смежные вопросы