WSADuplicateSocketA 関数 (winsock2.h)
WSADuplicateSocket 関数は、共有ソケットの新しいソケット記述子を作成するために使用できるWSAPROTOCOL_INFO構造体を返します。 WSADuplicateSocket 関数は、QOS 対応ソケットでは使用できません。
構文
int WSAAPI WSADuplicateSocketA(
[in] SOCKET s,
[in] DWORD dwProcessId,
[out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);
パラメーター
[in] s
ローカル ソケットを識別する記述子。
[in] dwProcessId
重複したソケットが使用されるターゲット プロセスのプロセス識別子。
[out] lpProtocolInfo
クライアントによって割り当てられたバッファーへのポインター。 これは、WSAPROTOCOL_INFO 構造体を格納するのに十分な大きさです。 サービス プロバイダーは、プロトコル情報構造体の内容をこのバッファーにコピーします。
戻り値
エラーが発生しない場合、 WSADuplicateSocket は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。 | |
ネットワーク サブシステムが失敗しました。 | |
指定されたパラメーターのいずれかが無効であることを示します。 | |
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
これ以上使用できるソケット記述子がありません。 | |
バッファーに空き領域がありません。 ソケットを作成できません。 | |
記述子はソケットではありません。 | |
lpProtocolInfo パラメーターは、ユーザー アドレス空間の有効な部分ではありません。 |
解説
WSADuplicateSocket 関数は、プロセス間のソケット共有を有効にするために使用されます。 ソース プロセスは WSADuplicateSocket を呼び出して、特別な WSAPROTOCOL_INFO 構造体を取得します。 一部のプロセス間通信 (IPC) メカニズムを使用して、この構造体の内容をターゲット プロセスに渡します。このメカニズムは、 WSASocket の呼び出しでそれを使用して、複製されたソケットの記述子を取得します。 特殊 なWSAPROTOCOL_INFO 構造は、対象プロセスで 1 回だけ使用できます。
ソケット記述子はプロセスのすべてのスレッドで有効であるため、 WSADuplicateSocket 関数を使用せずに、特定のプロセス内のスレッド間でソケットを共有できます。
次の表に、共有ソケットを確立して引き渡すシナリオの 1 つを示します。
Source process (依存元プロセス) | IPC | Destination process (依存先プロセス) |
---|---|---|
1) WSASocket、 WSAConnect | ||
2) 要求ターゲット プロセス識別子 | ==> | |
3) プロセス識別子要求を受信して応答する | ||
4) プロセス識別子を受信する | <== | |
5) WSADuplicateSocket を呼び出して特別な WSAPROTOCOL_INFO 構造を取得する | ||
6) WSAPROTOCOL_INFO 構造をターゲットに送信する | ||
==> | 7) 受信 WSAPROTOCOL_INFO 構造 | |
8) WSASocket を呼び出して、共有ソケット記述子を作成します。 | ||
9) データ交換に共有ソケットを使用する | ||
10) closesocket | <== |
共有ソケットを参照する記述子は、I/O 用に個別に使用できます。 ただし、Windows ソケット インターフェイスは、どの種類のアクセス制御も実装していないため、共有ソケットでの操作を調整するプロセスに依存します。 通常、共有ソケットは、ソケットの作成と接続の確立を担当する 1 つのプロセスと、情報交換を担当する他のプロセスを持つ場合に使用されます。
ソケットに関連付けられているすべての状態情報は、ソケット記述子が実際のソケットではなく重複しているため、すべての記述子で共通に保持されます。 たとえば、1 つの記述子を使用して実行された setsockopt 操作は、その後、任意またはすべての記述子の getsockopt を 使用して表示されます。 ソース プロセスと宛先プロセスの両方で、それぞれの WSASocket 関数呼び出しに同じフラグを渡す必要があります。 ソース プロセスがソケット関数を使用してソケットを作成する場合、宛先プロセスは wsASocket 関数呼び出しに WSA_FLAG_OVERLAPPED フラグを渡す必要があります。 プロセスは、重複したソケットで closesocket を呼び出すことができます。記述子は割り当て解除されます。 ただし、基になるソケットは、最後に残った記述子によって closesocket が呼び出されるまで開いたままです。
共有ソケットでの通知には、 WSAAsyncSelect と WSAEventSelect の通常の制約が適用 されます。 共有記述子のいずれかを使用してこれらの呼び出しのいずれかを発行すると、その登録を行うために使用された記述子に関係なく、ソケットの以前のイベント登録が取り消されます。 したがって、共有ソケットは、A を処理するFD_READイベントを配信できず、B を処理するためにイベントをFD_WRITE。このような緊密な調整が必要な状況では、開発者は個別のプロセスではなくスレッドを使用することをお勧めします。
Windows 8.1と Windows Server 2012 R2: WSADuplicateSocketW 関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
注意
winsock2.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして WSADuplicateSocket を定義します。 エンコードに依存しないエイリアスをエンコードニュートラルでないコードと組み合わせて使用すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。
要件
サポートされている最小のクライアント | Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock2.h |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |