Мы ищем способ включения TCP keepalive для клиентских сокетов в Windows CE 6.0 с использованием .net Compact framework 3.5.Включить Tcp Keepalive в Windows CE 6.0
До сих пор я нашел эти варианты:
Набор KeepAlive с использованием SetSocketOption на классе System.Net.Socket:
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
Это на самом деле работает, но использует Windows-глобальные настройки для KeepAlive , и это нужно проверить соединение каждый второй час, что слишком редко для нашего случая использования. Этот параметр таймаута можно изменить (глобально), изменив разделы реестра в разделе [HKEY_LOCAL_MACHINE \ Comm \ Tcpip \ Parms]. Это будет мое резервное решение, но я предпочел бы установить тайм-ауты для каждого соединения.
Затем я попытался использовать socket.IoControl, как предложено несколькими источниками в Интернете, чтобы установить эту опцию сокета, включая значения тайм-аута, но это приводит только к SocketException («Неверный аргумент был предоставлен»).
Пример
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// The native structure for this is defined in mstcpip.h as:
//struct tcp_keepalive {
//u_long onoff;
//u_long keepalivetime;
//u_long keepaliveinterval;
//};
//Set to on, 10 seconds and 1 second. From examples online u_long should be interpreted as unsigned 32bit.
byte[] inValue = new[] { (uint)1, (uint)10000, (uint)1000 }
.SelectMany(x => BitConverter.GetBytes(x))
.ToArray();
//0x98000004 is constant for SIO_KEEPALIVE_VALS found in mstcpip.h
int ioControlCodeKeepAliveValues = BitConverter.ToInt32(BitConverter.GetBytes(0x98000004), 0);
// Throws "An invalid argument was supplied" SocketException
socket.IOControl(ioControlCodeKeepAliveValues, inValue, null);
socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.120"),80));
Является ли этот код правильно, или это известное ограничение Windows CE 6, поддержания активности не может быть установлен в связи с этим?
Решение для добавления биения на уровне приложения является опцией, когда вы контролируете протокол приложения, но в этом случае у меня этого нет, и сервер не будет хорошо реагировать на меня, отправляя дополнительные данные в сокет I 'Боюсь. Вот почему я на уровне TCP. –
Так что, боюсь, вы в этом случае проиграли. Как я уже упоминал, встроенный keep-alive работает только иногда и не является надежным. Надеюсь, вы найдете другое решение :) – badsamaritan