Как установить Keepalive на Windows Server 2008 - PullRequest
2 голосов
/ 04 июля 2010

У меня есть приложение 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.

Ответы [ 2 ]

1 голос
/ 05 июля 2010

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

0 голосов
/ 04 июля 2010

Вероятно, ядро ​​возражает против вашего выбора значений.Я мог бы.Вы не можете серьезно хотеть установить интервал поддержания активности в 25 мс.Это совершенно безумная ценность.Значение по умолчанию составляет два часа, и нет смысла устанавливать его ниже, чем несколько минут.Точно так же время активности должно быть установлено примерно на полчаса, а не на полсекунды.

...