トランスポート アドレスの共有
ほとんどの場合、Winsock カーネル (WSK) アプリケーションは、別のソケットで既に使用されているローカル トランスポート アドレスにソケットをバインドできません。 WSK アプリケーションでは、SO_EXCLUSIVEADDRUSE および SO_REUSEADDR ソケット オプションを使用して、ソケットのバインド先のローカル トランスポート アドレスの共有を制御できます。 これらのどちらのソケット オプションも、既定ではソケットに対して設定されていません。 ソケット オプションを設定する方法の詳細については、「ソケットでの制御操作の実行」を参照してください。
次の表は、別のソケットで既に使用されているローカル トランスポート アドレスに 2 番目のソケットをバインドした結果を示しています。 Wildcard および Specific のケースでは、ソケットをワイルドカード ローカル トランスポート アドレスカードまたは特定のローカル トランスポート アドレスにバインドするかどうかを指定します。
2 番目のバインド | 最初のバインド | ||||||
---|---|---|---|---|---|---|---|
ソケット オプションなし (既定) |
SO_REUSEADDR |
SO_EXCLUSIVEADDRUSE |
|||||
Wildcard |
Specific |
Wildcard |
Specific |
Wildcard |
Specific |
||
ソケット オプションなし (既定) |
Wildcard |
INUSE |
SUCCESS |
INUSE |
SUCCESS |
INUSE |
SUCCESS |
Specific |
チェック |
INUSE |
チェック |
DENIED |
DENIED |
INUSE |
|
SO_REUSEADDR |
Wildcard |
DENIED |
SUCCESS |
SUCCESS |
SUCCESS |
DENIED |
SUCCESS |
Specific |
チェック |
DENIED |
SUCCESS |
SUCCESS |
DENIED |
DENIED |
|
SO_EXCLUSIVEADDRUSE |
Wildcard |
INUSE |
INUSE |
INUSE |
INUSE |
INUSE |
INUSE |
Specific |
チェック |
INUSE |
チェック |
INUSE |
DENIED |
INUSE |
結果は次のように定義されています。
SUCCESS
2 番目のソケットのバインド操作は成功します。 WSK サブシステムは、STATUS_SUCCESSの状態を返します。
INUSE
2 番目のソケットでのバインド操作が失敗します。 WSK サブシステムは、STATUS_ADDRESS_ALREADY_EXISTSの状態を返します。
DENIED
2 番目のソケットでのバインド操作が失敗します。 WSK サブシステムは、STATUS_ACCESS_DENIEDの状態を返します。
CHECK
アクセスチェックは、2 番目のソケットでのバインド操作が成功または失敗したかどうかを判断するために実行されます。 アクセスが許可されると、バインドは成功し、WSK サブシステムは STATUS_SUCCESS の状態を返します。 アクセスが拒否されると、バインドは失敗し、WSK サブシステムは STATUS_ACCESS_DENIED の状態を返します。
アクセス チェックが実行される前の表で定義されている場合、2 番目のソケットのセキュリティ コンテキストは、最初のソケットのセキュリティ記述子に対してチェックされます。
ソケットのセキュリティ コンテキストは、ソケットの作成時に WskSocket 関数または WskSocketConnect 関数に渡される OwningProcess パラメーターと OwningThread パラメーターによって決定されます。 ソケットの作成時に特定のプロセスまたはスレッドが指定されていない場合は、ソケットを作成したプロセスのセキュリティ コンテキストが使用されます。
ソケットのセキュリティ記述子は、ソケットの作成時に WskSocket 関数または WskSocketConnect 関数に渡される SecurityDescriptor パラメーターによって指定されます。 特定のセキュリティ記述子が指定されていない場合、WSK サブシステムは、トランスポート アドレスの共有を許可しない既定のセキュリティ記述子を使用します。 SO_WSK_SECURITY ソケット オプションを使用してソケットが作成された後に、ソケットにセキュリティ記述子を適用することもできます。
2 つのソケットが 2 つの異なる特定のローカル トランスポート アドレスにバインドされている場合、どちらのトランスポート アドレスも共有されません。 この状況では、2 番目のバインド操作は常に正常に完了します。