2

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 を返します。

4

2 に答える 2

1

私は解決策を見つけました、多分それは同じ問題に直面した他の誰かを助けることができます。非同期の直後にキープアライブを設定しようとしていました。接続呼び出しですが、接続呼び出しの完了後に設定しているので、問題は解決しました。


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を返します。

于 2010-07-05T02:59:02.843 に答える
0

おそらく、カーネルはあなたの選択した値に反対しています。私は...するだろう。キープアライブ間隔を 25 ミリ秒に設定することを真剣に考えることはできません。それは完全に非常識な値です。デフォルト値は 2 時間で、数分未満に設定しても意味がありません。同様に、keepalivetime は 0.5 秒ではなく、30 分程度に設定する必要があります。

于 2010-07-04T05:20:36.803 に答える