次の方法で共有


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 を呼び出すことによって特定のエラー コードを取得できます。

エラー コード Meaning
WSANOTINITIALIZED
この関数を使用する前に、 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 メカニズムを 使用して完全に受け入れるまで、接続は完全に受け入れられることはありません。
  • また、これは、アプリケーションが常に接続を受け入れるための受け入れコールバックを容易に処理する状態であることを意味します。 アプリケーションが他の処理の実行中にビジー状態の場合、アプリケーションが実際に接続を受け入れる前に、クライアント側がタイムアウトすることがあります。 これにより、クライアント エクスペリエンスが低下します。
  • 一部の TCP スタック最適化は、条件付き受け入れが完了した後でも、完全に受け入れられた接続には適用されません。 これにより、接続の有効期間全体のパフォーマンスが低下する可能性があります。

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

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

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

Requirements

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

こちらも参照ください

getsockopt

setsockopt

WSAAccept