TCP/IP 通信に winsock を使用する win32 アプリケーションがあります。WSAIoctl 関数でキープアライブ値を設定しており、Windows XP では正常に動作しています。
しかし、Winで。Server 2008 WSAIoctl が失敗し、WSAGetLastError が意味をなさない 10022 (無効な引数) を返します。
キープアライブを設定する私のコードは次のとおりです。
// set per-connection keep-alive option
tcp_keepalive keepAliveSettings;
keepAliveSettings.onoff = 1;
keepAliveSettings.keepalivetime = 500;
eepAliveSettings.keepaliveinterval = 25;
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); }
編集:
私は解決策を見つけました。同じ問題に直面した他の誰かを助けることができるかもしれません。非同期の直後にキープアライブを設定しようとしていました。接続呼び出しですが、接続呼び出しの完了後に設定しているため、問題は解決しました。
http://msdn.microsoft.com/en-us/library/ee470551(v=VS.85).aspxから
Windows Vista 以降では、sockopt 関数を使用して SO_KEEPALIVE ソケット オプションを設定できるのは、ソケットが移行状態ではなく既知の状態にある場合のみです。TCP の場合、SO_KEEPALIVE ソケット オプションは、接続関数 (connect、ConnectEx、WSAConnect、WSAConnectByList、または WSAConnectByName) が呼び出される前、または接続要求が実際に完了した後に設定する必要があります。接続関数が非同期で呼び出された場合、SO_KEEPALIVE ソケット オプションを設定する前に、接続の完了を待つ必要があります。接続要求がまだ処理中であるときにアプリケーションが SO_KEEPALIVE ソケット オプションを設定しようとすると、setsockopt 関数は失敗し、WSAEINVAL を返します。