Как реализовать TCP KeepAlive в VB.NET на TCP-клиенте (сокет)
Я хочу реализовать TCP KeepAlive для проверки сброшенных соединений, запустив таймер.
В моем случае у меня есть TCP-клиент (с использованием класса сокетов) и сторонний сервер (я не контролирую его). Как я могу использовать TCP KeepAlive на моем TCP-клиенте для проверки состояния соединения?
На данный момент я включил опцию TCP KeepAlive!
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: я новичок в программировании, поэтому, пожалуйста, извините меня за ошибки в коде.
1 ответ
Наконец мне удалось использовать 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, и я заметил отправленные пакеты.