共有ソケット

WSADuplicateSocket 関数が導入され、プロセス間でのソケット共有が可能になります。 ソース プロセスは WSADuplicateSocket を呼び出して、ターゲット プロセス識別子の特別な WSAPROTOCOL_INFO 構造を取得します。 一部のプロセス間通信 (IPC) メカニズムを使用して、この構造体の内容をターゲット プロセスに渡します。 その後、ターゲット プロセスは WSPSocket の呼び出しでWSAPROTOCOL_INFO構造体を使用します。 この関数によって返されるソケット記述子は、基になるソケットに対する追加のソケット記述子になるため、共有されます。 ソケット記述子はプロセスのすべてのスレッドで有効であるため、 WSADuplicateSocket 関数を使用せずに、特定のプロセス内のスレッド間でソケットを共有できます。

共有ソケットを参照する 2 つ以上の記述子は、I/O に関する限り独立して使用できます。 ただし、Winsock インターフェイスはアクセス制御の種類を実装していないため、プロセスは共有ソケット上のすべての操作を調整する必要があります。 ソケットを共有する一般的な例は、ソケットの作成と接続の確立に 1 つのプロセスを使用することです。 その後、このプロセスは、情報交換を担当する他のプロセスにソケットを引き離します。

WSADuplicateSocket 関数は、基になるソケットではなく、ソケット記述子を作成します。 その結果、ソケットに関連付けられているすべての状態は、すべての記述子で共通に保持されます。 たとえば、1 つの記述子を使用して実行された setsockopt 操作は、その後、任意またはすべての記述子の getsockopt を 使用して表示されます。 プロセスは、重複したソケットで closesocket を呼び出すことができます。記述子の割り当てが解除されます。 ただし、基になるソケットは、 closesocket が最後の残りの記述子で呼び出されるまで開いたままです。

共有ソケットでの通知には、 WSAAsyncSelect 関数と WSAEventSelect 関数の通常の制約が適用されます。 共有記述子のいずれかを使用してこれらの呼び出しのいずれかを発行すると、その登録に使用された記述子に関係なく、ソケットの以前のイベント登録が取り消されます。 したがって、たとえば、プロセス A がイベントを受信FD_READし、プロセス B がイベントFD_WRITE受信するようにすることはできません。 このような緊密な調整が必要な場合は、開発者が個別のプロセスではなくスレッドを使用することをお勧めします。