次の方法で共有


WSADuplicateSocketW 関数 (winsock2.h)

WSADuplicateSocket 関数 は、共有ソケットの新しいソケット記述子を作成するために使用できる WSAPROTOCOL_INFO 構造体を返します。 WSADuplicateSocket 関数は、QOS 対応ソケットでは使用できません。

構文

int WSAAPI WSADuplicateSocketW(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOW lpProtocolInfo
);

パラメーター

[in] s

ローカル ソケットを識別する記述子。

[in] dwProcessId

重複したソケットが使用されるターゲット プロセスのプロセス識別子。

[out] lpProtocolInfo

WSAPROTOCOL_INFO 構造体を格納するのに十分な大きさの、クライアントによって割り当てられたバッファーへのポインター。 サービス プロバイダーは、プロトコル情報構造の内容をこのバッファーにコピーします。

戻り値

エラーが発生しない場合、WSADuplicateSocket は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、WSAGetLastError呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED の
WSAStartup 呼び出し 成功してから、この関数を使用する必要があります。
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEINVAL の
指定されたパラメーターのいずれかが無効であることを示します。
WSAEINPROGRESS を する
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEMFILE の
これ以上ソケット記述子を使用できません。
WSAENOBUFS の
使用できるバッファー領域はありません。 ソケットを作成できません。
WSAENOTSOCK の
記述子はソケットではありません。
WSAEFAULT の
lpProtocolInfo パラメーターは、ユーザー・アドレス・スペースの有効な部分ではありません。

備考

WSADuplicateSocket 関数 を使用して、プロセス間のソケット共有を有効にします。 ソース プロセス WSADuplicateSocket を呼び出して、特殊な WSAPROTOCOL_INFO 構造を取得します。 一部のプロセス間通信 (IPC) メカニズムを使用して、この構造体の内容をターゲット プロセスに渡します。このメカニズムは、WSASocketする呼び出しでそれを使用して、重複したソケットの記述子を取得します。 特殊な WSAPROTOCOL_INFO 構造は、ターゲット プロセスで 1 回だけ使用できます。

ソケット記述子はプロセスのすべてのスレッドで有効であるため、WSADuplicateSocket 関数を使用せずに、特定のプロセス内のスレッド間でソケットを共有できます。

次の表に、共有ソケットを確立して引き渡すシナリオの 1 つを示します。

ソース プロセス IPC 宛先プロセス
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 関数呼び出しに同じフラグを渡す必要があります。 ソース プロセスが ソケット 関数を使用してソケットを作成する場合、宛先プロセスは、WSA_FLAG_OVERLAPPED フラグを WSASocket 関数呼び出し 渡す必要があります。 プロセスは、重複したソケット closesocket を呼び出すことができます。記述子の割り当てが解除されます。 ただし、基になるソケットは、最後の残りの記述子によって closesocket が呼び出されるまで 開いたままです。

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

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 アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsock2.h
ライブラリ Ws2_32.lib
DLL Ws2_32.dll

関連項目

WSASocket の

Winsock Functions

Winsock リファレンス