У меня есть приложение win32, в котором winsock используется для связи по TCP / IP.
Я устанавливаю значение keepalive с помощью функции WSAIoctl, и оно работает нормально с Windows XP.
Но на Win. Server 2008 WSAIoctl завершается ошибкой, и WSAGetLastError возвращает 10022 (недопустимые аргументы), что не имеет никакого смысла.
Мой код, который устанавливает keepalive, следующий:
<code>
// set per-connection keep-alive option
tcp_keepalive keepAliveSettings;
keepAliveSettings.onoff = 1;
keepAliveSettings.keepalivetime = 500;
eepAliveSettings.keepaliveinterval = 25;</p>
<p>int lastError = WSAIoctl(m_soc.chns[0], SIO_KEEPALIVE_VALS, &keepAliveSettings, sizeof(keepAliveSettings), NULL, 0, &BytesReturned, NULL, NULL);
if(lastError == SOCKET_ERROR) {
lastError = WSAGetLastError();
Logger::Error("Setting keepalive failed ErrCode %d\n",lastError); }
EDIT:
Я нашел решение, может быть, оно может помочь кому-то еще, кто столкнулся с той же проблемой. Я пытался установить keepalive сразу после асинхронного. вызов по соединению, но теперь я выполняю настройку после завершения соединения, и это решило проблему.
С http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspx
В Windows Vista и более поздних
Опция сокета SO_KEEPALIVE может быть только
установить с помощью функции setsockopt, когда
розетка находится в известном состоянии
не переходное состояние. Для TCP
Опция сокета SO_KEEPALIVE должна быть
установить либо перед функцией подключения
(connect, ConnectEx, WSAConnect,
WSAConnectByList или WSAConnectByName)
называется, или после подключения
Запрос фактически завершен. Если
была вызвана функция подключения
асинхронно, то это требует
в ожидании завершения соединения
прежде чем пытаться установить SO_KEEPALIVE
опция сокета. Если приложение
пытается установить SO_KEEPALIVE
опция сокета при подключении
запрос еще обрабатывается,
функция setsockopt потерпит неудачу и
вернуть WSAEINVAL.