LPWSPSOCKET
コールバックシグネチャ
SOCKET LPWSPSOCKET(
INT af,
INT type,
INT protocol,
WSAPROTOCOL_INFOW* lpProtocolInfo,
DWORD g,
DWORD dwFlags,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| af | INT | アドレスファミリーの指定。 |
| type | INT | 新しいソケットの型の指定。 |
| protocol | INT | 指定されたアドレスファミリーに固有の、ソケットで使用するプロトコル。 |
| lpProtocolInfo | WSAPROTOCOL_INFOW* | 作成するソケットの特性を定義する WSAProtocol_Info 構造体へのポインター。 |
| g | DWORD | 予約されています。 |
| dwFlags | DWORD | ソケットの属性の指定。 |
| lpErrno | INT* | エラーコードへのポインター。 |
公式ドキュメント
LPWSPSocket 関数はソケットを作成します。共有ソケットの作成において LPWSPSocket が果たす役割については、共有ソケット および SPI における共有ソケット を参照してください。
戻り値
エラーが発生しなかった場合、 LPWSPSocket は新しいソケットを参照するディスクリプターを返します。それ以外の場合は INVALID_SOCKET が返され、固有のエラーコードが lpErrno に格納されます。
| エラーコード | 意味 |
|---|---|
| ネットワークサブシステムに障害が発生しました。 | |
| 指定されたアドレスファミリーはサポートされていません。 | |
| ブロッキング Windows Sockets 呼び出しが進行中であるか、サービスプロバイダーがコールバック関数をまだ処理中です。 | |
| 利用可能なソケットディスクリプターがこれ以上ありません。 | |
| 利用可能なバッファー領域がありません。ソケットを作成できません。 | |
| 指定されたプロトコルはサポートされていません。 | |
| 指定されたプロトコルは、このソケットに対して型が正しくありません。 | |
| 指定されたソケット型は、このアドレスファミリーではサポートされていません。 | |
| 指定されたパラメーター g が有効ではありません。 |
解説(Remarks)
LPWSPSocket 関数は、ソケットディスクリプターと関連するリソースを割り当てます。既定では、作成されるソケットはオーバーラップ属性を持ちません。Windows Sockets プロバイダーは、Windows のインストール可能ファイルシステムとして実装し、ソケットディスクリプターとしてシステムファイルハンドルを提供することが推奨されます。これらのプロバイダーは、この関数から戻る前に
WPUModifyIFSHandle を呼び出す必要があります。ファイルシステムベースでない Windows Sockets プロバイダーの場合は、この関数から戻る前に
WPUCreateSocketHandle を使用して、Ws2_32.dll から一意のソケットディスクリプターを取得する必要があります。詳細については
ディスクリプターの割り当て を参照してください。
af、type、protocol の値は、対応する API 関数 socket または WSASocket でアプリケーションが指定した値です。サービスプロバイダーは、対象のプロトコルにとって適切であれば、これらの値の一部またはすべてを無視することも、参照することもできます。ただし、Ws2_32.dll は af と type の値 0 をワイルドカード値とみなすため、プロバイダーは値 0 を受け入れられる必要があります。また、af、type、protocol のいずれについても、マニフェスト定数 FROM_PROTOCOL_INFO の値を受け入れる必要があります。この値は、Windows Sockets 2 アプリケーションが WSAProtocol_Info 構造体の対応する値 (iAddressFamily、iSocketType、iProtocol) を使用する必要があることを示します。
dwFlags パラメーターでは、次のフラグをビットごとの OR 演算子で組み合わせて、ソケットの属性を指定できます。
| フラグ | 意味 |
|---|---|
| WSA_FLAG_OVERLAPPED | このフラグを指定すると、オーバーラップソケットが作成されます。オーバーラップソケットでは、LPWSPSend、LPWSPSendTo、LPWSPRecv、LPWSPRecvFrom、LPWSPIoctl をオーバーラップ I/O 操作に利用でき、複数の操作を同時に開始して処理できます。オーバーラップ操作に対応するすべての関数は、オーバーラップ操作に関連するパラメーターの値が NULL であれば、オーバーラップソケット上での非オーバーラップの使用もサポートします。 |
| WSA_FLAG_MULTIPOINT_C_ROOT | 作成されるソケットが、マルチポイントセッションにおける c_root になることを示します。プロトコルの WSAProtocol_Info 構造体でルート付きのコントロールプレーンが示されている場合にのみ許可されます。 |
| WSA_FLAG_MULTIPOINT_C_LEAF | 作成されるソケットが、マルチキャストセッションにおける c_leaf になることを示します。プロトコルの WSAProtocol_Info 構造体で XP1_SUPPORT_MULTIPOINT が示されている場合にのみ許可されます。 |
| WSA_FLAG_MULTIPOINT_D_ROOT | 作成されるソケットが、マルチポイントセッションにおける d_root になることを示します。プロトコルの WSAProtocol_Info 構造体でルート付きのデータプレーンが示されている場合にのみ許可されます。 |
| WSA_FLAG_MULTIPOINT_D_LEAF | 作成されるソケットが、マルチポイントセッションにおける d_leaf になることを示します。プロトコルの WSAProtocol_Info 構造体で XP1_SUPPORT_MULTIPOINT が示されている場合にのみ許可されます。 |
マルチポイントソケットでは、WSA_FLAG_MULTIPOINT_C_ROOT または WSA_FLAG_MULTIPOINT_C_LEAF のいずれか一方だけを指定し、さらに WSA_FLAG_MULTIPOINT_D_ROOT または WSA_FLAG_MULTIPOINT_D_LEAF のいずれか一方だけを指定する必要があります。詳細については SPI におけるプロトコル非依存のマルチキャストとマルチポイント を参照してください。
SOCK_STREAM などのコネクション指向ソケットは全二重の接続を提供し、データを送受信する前に接続済みの状態になっている必要があります。他のソケットへの接続は LPWSPConnect の呼び出しで作成します。接続が確立されると、 LPWSPSend および LPWSPRecv の呼び出しでデータを転送できます。セッションが終了したら、 LPWSPCloseSocket を実行する必要があります。
信頼性のあるコネクション指向ソケットの実装に使用される通信プロトコルは、データが失われたり重複したりしないことを保証します。ピアのプロトコルがバッファー領域を確保しているデータを妥当な時間内に送信できなかった場合、接続は切断されたものとみなされ、以降の呼び出しはエラーコード WSAETIMEDOUT で失敗します。
コネクションレスのメッセージ指向ソケットでは、 LPWSPSendTo および LPWSPRecvFrom を使用して、任意のピアとの間でデータグラムを送受信できます。このようなソケットを LPWSPConnect で特定のピアに接続した場合は、 LPWSPSend を使用してそのピアにデータグラムを送信でき、 LPWSPRecv を使用して (そのピアからのみ) データグラムを受信できます。
SOCK RAW 型のソケットのサポートは必須ではありませんが、意味がある場合には raw ソケットをサポートすることがサービスプロバイダーに推奨されます。
階層化サービスプロバイダーはこの関数の実装を提供しますが、プロトコルチェーン内の次の層の LPWSPSocket を呼び出す場合には、この関数のクライアントでもあります。この関数の lpProtocolInfo パラメーターには、プロトコルチェーンの各層を通じて伝播される際の特別な考慮事項があります。
プロトコルチェーン内の次の層がさらに別の層である場合、次の層の LPWSPSocket を呼び出すときに、この層は、変更されていない同じ WSAProtocol_Info 構造体を、変更されていない同じチェーン情報とともに参照する lpProtocolInfo を次の層に渡す必要があります。ただし、次の層がベースプロトコル (つまりチェーンの最後の要素) である場合、この層はベースプロバイダーの LPWSPSocket を呼び出すときに置き換えを行います。この場合、lpProtocolInfo パラメーターはベースプロバイダーの WSAPROTOCOL_INFO 構造体を参照する必要があります。
このポリシーの重要な利点の 1 つは、ベースサービスプロバイダーがプロトコルチェーンを認識する必要がないことです。
この伝播ポリシーは、 LPWSPAddressToString、 LPWSPDuplicateSocket、 WSPStartup、 LPWSPStringToAddress など、他の関数の階層化されたシーケンスを通じて WSAProtocol_Info 構造体を伝播する場合にも同様に適用されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)