SO_CONDITIONAL_ACCEPT ソケット オプション

SO_CONDITIONAL_ACCEPT ソケット オプションは、アプリケーションがリッスン ソケットで受信接続を受け入れるかどうかを決定できるように設計されています。

ソケット オプションの値

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

構文

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

パラメーター

s [in]

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

level [in]

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

optname [in]

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

optval [out]

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

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

optlen [in, out]

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

戻り値

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

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

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

 

注釈

SO_CONDITIONAL_ACCEPT ソケット オプションを指定して呼び出される setsockopt 関数を使用すると、アプリケーションはリッスンしているソケットで受信接続を受け入れるかどうかを判断できます。 ソケットの条件付き受け入れオプションは、既定では無効 ( FALSE に設定) されています。

このソケット オプションが有効になっている場合、TCP スタックは接続を自動的に受け入れません。 アプリケーションが WSAAccept 関数に登録されている条件付き受け入れコールバックを介して接続を受け入れることを示すのを待ちます。 接続要求を受信すると、Winsock は、アプリケーションによって登録された条件付き受け入れコールバックを呼び出します。 条件付き受け入れコールバックが返された場合にのみ CF_ACCEPT 、Winsock は接続を完全に受け入れるようにトランスポートに通知します。

SO_CONDITIONAL_ACCEPT ソケット オプションが有効 (TRUE に設定) に設定されている場合、ソケットにはいくつかの副作用があります。

  • これにより、アプリケーションが接続を受け入れる所有権を取得しているため、TCP スタックの組み込みの SYN 攻撃保護防御が無効になります。
  • これにより、リッスン ソケットの代わりに接続が受け入れられないため、リッスン バックログが実質的に無効になります。 アプリケーションが CF_ACCEPT メカニズムを 使用して完全に受け入れるまで、接続が完全に受け入れられることはありません。
  • また、これは、接続を受け入れるための受け入れコールバックを容易に処理するために、アプリケーションが常に状態であることを考慮することを意味します。 アプリケーションが他の処理の実行中にビジー状態の場合、アプリケーションが実際に接続を受け入れる前に、クライアント側がタイムアウトになる可能性があります。 これにより、クライアント エクスペリエンスが低下します。

一般に、アプリケーションが条件付き受け入れを使用するメイン理由は、接続しているクライアントによって使用される送信元 IP アドレスまたはポートを調べてから、接続を受け入れるか拒否するかを決定することです。 ただし、SO_CONDITIONAL_ACCEPT オプションが有効でなく、アプリケーションで TCP スタックとリッスン バックログが期待どおりに動作する場合は、アプリケーションのパフォーマンスが向上する可能性があります。 その後、アプリケーションが受け入れられた接続を処理するときに、不適切な IP ソース アドレスまたはポートからの接続である場合、アプリケーションはソケットを閉じるだけです。 この動作のセキュリティ上の欠点は、アプリケーションが以前に受け入れた接続を強制的に閉じたため、アプリケーションが IP アドレスとポートでリッスンしていることを確認できるようになったことです。 ただし、 SO_CONDITIONAL_ACCEPT を有効にすることに関する欠点は、一般にこの制限を上回ります。

SO_CONDITIONAL_ACCEPT ソケット オプションで呼び出される getsockopt 関数を使用すると、アプリケーションは条件付き受け入れオプションの現在の状態を取得できますが、これは通常は使用されない機能です。 アプリケーションがソケットで条件付き受け入れを有効にする必要がある場合は、 setsockopt 関数を呼び出して オプションを有効にします。

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

要件

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

こちらもご覧ください

getsockopt

setsockopt

WSAAccept