SIO_KEEPALIVE_VALS コントロール コード
説明
SIO_KEEPALIVE_VALS制御コードは、TCP キープアライブ タイムアウトと間隔を指定する TCP キープアライブ オプションの接続ごとの設定を有効または無効にします。
この操作を実行するには、次のパラメーターを使用して WSAIoctl または WSPIoctl 関数を呼び出します。
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_KEEPALIVE_VALS, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to tcp_keepalive struct
(DWORD) cbInBuffer, // length of input buffer
NULL, // output buffer
0, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_KEEPALIVE_VALS, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to tcp_keepalive struct
(DWORD) cbInBuffer, // length of input buffer
NULL, // output buffer
0, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
パラメーター
s
ソケットを識別する記述子。
dwIoControlCode
操作の制御コード。 この操作 にはSIO_KEEPALIVE_VALS を使用します。
lpvInBuffer
入力バッファーへのポインター。 このパラメーターは 、tcp_keepalive 構造体を指している必要があります。
cbInBuffer
入力バッファーのサイズ (バイト単位)。 このパラメーターは、lpvInBuffer パラメーターが指すtcp_keepalive構造体のサイズ以上である必要があります。
lpvOutBuffer
出力バッファーへのポインター。 このパラメーターは、この操作では使用されません。
cbOutBuffer
出力バッファーのサイズ (バイト単位)。 このパラメーターは 0 に設定する必要があります。
lpcbBytesReturned
出力バッファーに格納されているデータのサイズをバイト単位で受け取る変数へのポインター。 この返されるパラメーターは、出力がないため、この操作の DWORD 値が 0 であることを示します。
lpvOverlapped
WSAOVERLAPPED 構造体へのポインター。
重複する属性なしでソケット s が作成された場合、 lpOverlapped パラメーターは無視されます。
重複した属性を使用して s を開き、 lpOverlapped パラメーターが NULL でない場合、操作は重複 (非同期) 操作として実行されます。 この場合、 lpOverlapped パラメーターは有効な WSAOVERLAPPED 構造体を指している必要があります。
重複する操作の場合、 WSAIoctl または WSPIoctl 関数は直ちにを返し、操作が完了すると適切な完了メソッドが通知されます。 それ以外の場合、操作が完了するかエラーが発生するまで、関数は を返しません。
lpCompletionRoutine
種類: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
操作が完了したときに呼び出される完了ルーチンへのポインター (重複していないソケットの場合は無視されます)。
lpThreadId
WPUQueueApc への後続の呼び出しでプロバイダーによって使用される WSATHREADID 構造体へのポインター。 プロバイダーは、WPUQueueApc 関数が返されるまで、参照先の WSATHREADID 構造体 (同じへのポインターではない) を格納する必要があります。
メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。
lpErrno
エラー コードへのポインター。
メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。
戻り値
操作が正常に完了すると、 WSAIoctl または WSPIoctl 関数は 0 を返します。
操作が失敗した場合、または保留中の場合、 WSAIoctl または WSPIoctl 関数は SOCKET_ERRORを返します。 拡張エラー情報を取得するには、 WSAGetLastError を呼び出します。
エラー コード | 意味 |
---|---|
WSA_IO_PENDING | 重複した操作が正常に開始され、完了は後で示されます。 |
WSA_OPERATION_ABORTED | ソケットのクローズまたは SIO_FLUSH IOCTL コマンドの実行により、重複した操作が取り消されました。 |
WSAEFAULT | lpOverlapped パラメーターまたは lpCompletionRoutine パラメーターは、ユーザー・アドレス・スペースの有効な部分に完全には含まれていません。 |
WSAEINPROGRESS | 関数は、コールバックが進行中のときに呼び出されます。 |
WSAEINTR | ブロック操作が中断されました。 |
WSAEINVAL | dwIoControlCode パラメーターが有効なコマンドではないか、指定された入力パラメーターが受け入れられないか、指定されたソケットの種類にコマンドが適用されません。 |
WSAENETDOWN | ネットワーク サブシステムが失敗しました。 |
WSAENOPROTOOPT | ソケット オプションは、指定されたプロトコルではサポートされていません。 このエラーは、データグラム ソケットに対して返されます。 |
WSAENOTSOCK | 記述子 s はソケットではありません。 |
WSAEOPNOTSUPP | 指定された IOCTL コマンドはサポートされていません。 このエラーは、 SIO_KEEPALIVE_VALS IOCTL がトランスポート プロバイダーでサポートされていない場合に返されます。 |
注釈
SIO_KEEPALIVE_VALS IOCTL は、Windows 2000 以降のバージョンのオペレーティング システムでサポートされています。
SIO_KEEPALIVE_VALS制御コードは、TCP キープアライブ パケットに使用される TCP キープアライブ タイムアウトと間隔を指定する TCP キープアライブ オプションの接続ごとの設定を有効または無効にします。 キープアライブ オプションの詳細については、 IETF Web サイトで利用可能な RFC 1122 で指定されているインターネット ホストの要件- 通信層に関するセクション 4.2.3.6 を参照してください。 (このリソースは英語でのみ使用できます)。
lpvInBuffer パラメーターは、Mstcpip.h ヘッダー ファイルで定義されているtcp_keepalive構造体を指している必要があります。 この構造体は次のように定義されます。
/* Argument structure for SIO_KEEPALIVE_VALS */
struct tcp_keepalive {
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};
onoff メンバーで指定された値は、TCP キープアライブが有効か無効かを決定します。 onoff メンバーが 0 以外の値に設定されている場合、TCP キープアライブが有効になり、構造体内の他のメンバーが使用されます。 keepalivetime メンバーは、最初のキープアライブ パケットが送信されるまで、アクティビティなしでタイムアウト (ミリ秒単位) を指定します。 keepaliveinterval メンバーは、受信確認が受信されない場合に連続するキープアライブ パケットが送信されるまでの間隔をミリ秒単位で指定します。
SOL_SOCKET ソケット オプションの 1 つである SO_KEEPALIVE オプションを使用して、接続で TCP キープアライブを有効または無効にしたり、このオプションの現在の状態を照会したりすることもできます。 ソケットで TCP キープアライブが有効になっているかどうかを照会するには、 SO_KEEPALIVE オプションを使用して getsockopt 関数を呼び出すことができます。 TCP キープアライブを有効または無効にするには、SO_KEEPALIVE オプションを使用して setsockopt 関数を呼び出すことができます。 SO_KEEPALIVEで TCP キープアライブが有効になっている場合、SIO_KEEPALIVE_VALSを使用してこれらの値が変更されていない限り、既定の TCP 設定はキープアライブ タイムアウトと間隔に使用されます。
キープアライブ タイムアウトの既定のシステム全体の値は、 KeepAliveTime レジストリ設定を使用して制御できます。これは、ミリ秒単位の値を受け取ります。 キーが設定されていない場合、既定のキープアライブ タイムアウトは 2 時間です。 キープアライブ間隔の既定のシステム全体の値は、ミリ秒単位の値を受け取る KeepAliveInterval レジストリ設定を使用して制御できます。 キーが設定されていない場合、既定のキープアライブ間隔は 1 秒です。
Windows Vista 以降では、キープアライブ プローブ (データ再送信) の数は 10 に設定され、変更できません。
Windows Server 2003、Windows XP、Windows 2000 では、キープアライブ プローブの数の既定の設定は 5 です。 キープアライブ プローブの数は、 TcpMaxDataRetransmissions レジストリ設定と PPTPTcpMaxDataRetransmissions レジストリ設定を使用して制御できます。 キープアライブ プローブの数は、2 つのレジストリ キー値のうち大きい方に設定されます。 この数が 0 の場合、キープアライブ プローブは送信されません。 この数値が 255 を超える場合は、255 に調整されます。