SO_KEEPALIVE ソケット オプション

SO_KEEPALIVE ソケット オプションは、アプリケーションがソケット接続に対してキープアライブ パケットを有効にできるように設計されています。

このソケット オプションの状態を照会するには、 getsockopt 関数を呼び出します。 このオプションを設定するには、次のパラメーターを指定して setsockopt 関数を呼び出します。

ソケット オプションの値

このソケット オプションを表す定数は0x0008。

構文

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_KEEPALIVE, // optname
  (char *) optval, // input buffer,
  (int) optlen  // size of input buffer
);

パラメーター

s [in]

ソケットを識別する記述子。

level [in]

オプションが定義されているレベル。 この操作 にはSOL_SOCKET を使用します。

optname [in]

値を設定するソケット オプション。 この操作 にはSO_KEEPALIVE を使用します。

optval [out]

設定するオプションの値を含むバッファーへのポインター。 このパラメーターは、 DWORD 値のサイズ以上のバッファーを指す必要があります。

この値はブール値として扱われ、 FALSE (無効) を示すために 0 が使用され、 TRUE (有効) を示す 0 以外の値が使用されます。

optlen [in]

optval バッファーのサイズ (バイト単位)。 このサイズは 、DWORD 値のサイズ以上である必要があります。

戻り値

操作が正常に完了すると、 setsockopt は 0 を返します。

操作が失敗した場合は、SOCKET_ERRORの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALISED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEFAULT
optval パラメーターまたは optlen パラメーターの 1 つは、ユーザー アドレス空間の有効な部分にないメモリを指します。 optlen パラメーターが指す値が DWORD 値のサイズより小さい場合も、このエラーが返されます。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
level パラメーターが不明または無効です。 Windows Vista 以降では、ソケットが遷移状態の場合も、このエラーが返されます。
WSAENOPROTOOPT
オプションが不明であるか、指定されたプロトコル ファミリでサポートされていません。 このエラーは、 s パラメーターで渡されたソケット記述子がデータグラム ソケット用の場合に返されます。
WSAENOTSOCK
記述子はソケットではありません。

 

解説

SO_KEEPALIVE ソケット オプションを指定して呼び出される getsockopt 関数を使用すると、アプリケーションは keepalive オプションの現在の状態を取得できますが、これは通常使用される機能ではありません。 アプリケーションがソケットでキープアライブ パケットを有効にする必要がある場合は、 setsockopt 関数を呼び出してオプションを有効にします。

SO_KEEPALIVE ソケット オプションで呼び出される setsockopt 関数を使用すると、アプリケーションはソケット接続に対してキープアライブ パケットを有効にすることができます。 ソケット のSO_KEEPALIVE オプションは、既定では無効 ( FALSE に設定) されています。

このソケット オプションを有効にすると、TCP スタックは、接続のデータまたは受信確認パケットが一定の間隔で受信されていないときにキープアライブ パケットを送信します。 キープアライブ オプションの詳細については、IETF Web サイトで利用可能な RFC 1122 で指定されているインターネット ホストの要件- 通信層に関するセクション 4.2.3.6 を参照してください。 (このリソースは英語でのみ使用できます)。

SO_KEEPALIVE ソケット オプションは、キープアライブ (接続指向プロトコル) の概念をサポートするプロトコルに対してのみ有効です。 TCP の場合、既定のキープアライブ タイムアウトは 2 時間、キープアライブ間隔は 1 秒です。 キープアライブ プローブの既定の数は、Windows のバージョンによって異なります。

SIO_KEEPALIVE_VALSコントロール コードを使用して、キープアライブを有効または無効にし、1 つの接続のタイムアウトと間隔を調整できます。 SO_KEEPALIVEでキープアライブが有効になっている場合、SIO_KEEPALIVE_VALSを使用してこれらの値が変更されていない限り、既定の TCP 設定はキープアライブ タイムアウトと間隔に使用されます。

キープアライブ タイムアウトの既定のシステム全体の値は、 KeepAliveTime レジストリ設定を使用して制御できます。これは、ミリ秒単位の値を受け取ります。 キープアライブ間隔の既定のシステム全体の値は、ミリ秒単位の値を受け取る KeepAliveInterval レジストリ設定を使用して制御できます。

Windows Vista 以降では、キープアライブ プローブ (データ再送信) の数は 10 に設定され、変更できません。

Windows Server 2003、Windows XP、Windows 2000 では、キープアライブ プローブの数の既定の設定は 5 です。 キープアライブ プローブの数は、 TcpMaxDataRetransmissions および PPTPTcpMaxDataRetransmissions レジストリ設定を使用して制御できます。 キープアライブ プローブの数は、2 つのレジストリ キー値のうち大きい方に設定されます。 この数が 0 の場合、キープアライブ プローブは送信されません。 この数値が 255 を超える場合は、255 に調整されます。

Windows Vista 以降では、 ソケットが 遷移状態ではなく既知の状態にある場合にのみ、SO_KEEPALIVE ソケット オプションを setsockopt 関数を使用して設定できます。 TCP の場合、接続関数 (connectConnectExWSAConnect、WSAConnectByList、または WSAConnectByName) が呼び出される前、または接続要求が実際に完了した後に、SO_KEEPALIVE ソケット オプションを設定する必要があります。 接続関数が非同期的に呼び出された場合は、 SO_KEEPALIVE ソケット オプションを設定する前に、接続の完了を待機する必要があります。 接続要求がまだ処理中のときにアプリケーションが SO_KEEPALIVE ソケット オプションを設定しようとすると、 setsockopt 関数は失敗し、 WSAEINVAL を返します。

Windows Server 2003、Windows XP、および Windows 2000 では、ソケットが遷移状態 (接続要求がまだ進行中) の場合、setockopt 関数と既知の状態を使用して、SO_KEEPALIVE ソケット オプションを設定できます。

Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

要件

要件
サポートされている最小のクライアント
Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー
Windows 2000 Server [デスクトップ アプリのみ]
ヘッダー
Ws2def.h (Winsock2.h を含む)

関連項目

getsockopt

setsockopt

KeepAliveTime

KeepAliveInterval

PPTPTcpMaxDataRetransmissions

ソケット

SIO_KEEPALIVE_VALS

TcpMaxDataRetransmissions

WSAGetLastError