LPWSPACCEPT
コールバックシグネチャ
SOCKET LPWSPACCEPT(
SOCKET s,
SOCKADDR* addr,
INT* addrlen,
LPCONDITIONPROC lpfnCondition,
UINT_PTR dwCallbackData,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| s | SOCKET | LPWSPListen の後、接続を待ち受けているソケットを識別する記述子です。 |
| addr | SOCKADDR* | 接続元のエンティティのアドレス (サービスプロバイダーが認識しているもの) を受け取るバッファーへの省略可能なポインターです。addr パラメーターの正確な形式は、sockaddr 構造体内のソケットが作成されたときに確立されたアドレスファミリーによって決まります。 |
| addrlen | INT* | addr パラメーターの長さ (バイト単位) を格納する整数への省略可能なポインターです。 |
| lpfnCondition | LPCONDITIONPROC | Windows Sockets が用意する省略可能な条件関数のプロシージャインスタンスアドレスです。この関数は、パラメーターとして渡される呼び出し元の情報に基づいて、受け入れまたは拒否の判断に使用されます。 |
| dwCallbackData | UINT_PTR | 条件関数の dwCallbackData パラメーターの値として Windows Socket 2 クライアントに渡し返されるコールバックデータです。このパラメーターはサービスプロバイダーによって解釈されません。 |
| lpErrno | INT* | エラーコードへのポインターです。 |
公式ドキュメント
LPWSPAccept 関数は、条件関数の戻り値に基づいて接続を条件付きで受け入れます。
戻り値
エラーが発生しない場合、LPWSPAccept は受け入れたソケットの記述子である SOCKET 型の値を返します。それ以外の場合は INVALID_SOCKET が返され、具体的なエラーコードは lpErrno で取得できます。
| エラーコード | 意味 |
|---|---|
| 条件関数の戻り値 (CF_REJECT) で示されたとおり、接続要求は強制的に拒否されました。 | |
| 着信接続が通知されましたが、呼び出しを受け入れる前にリモートピアによって終了されました。 | |
| ネットワークサブシステムに障害が発生しました。 | |
| addrlen パラメーターが小さすぎるか、lpfnCondition パラメーターがユーザーアドレス空間の一部ではありません。 | |
| (ブロッキング) 呼び出しが LPWSPCancelBlockingCall によってキャンセルされました。 | |
| ブロッキング Windows Sockets 呼び出しが進行中です。 | |
| LPWSPAccept より前に LPWSPListen が呼び出されていない、条件関数で指定されたパラメーター g が有効な値ではない、条件関数の戻り値が有効なものではない、または指定されたソケットが無効な状態にある場合です。 | |
| LPWSPAccept の呼び出し時にキューが空ではなく、使用できるソケット記述子がありません。 | |
| 使用できるバッファー領域がありません。 | |
| 記述子がソケットではありません。 | |
| 参照されたソケットは、コネクション指向のサービスをサポートする種類ではありません。 | |
| 条件関数の戻り値 (CF_DEFER) で示されたとおり、接続要求の受け入れは延期されました。 | |
| ソケットが非ブロッキングとしてマークされており、受け入れられる接続がありません。 | |
| 提示された接続要求がタイムアウトしたか、取り下げられました。 |
解説(Remarks)
LPWSPAccept 関数は、ソケット s の保留中の接続キューから最初の接続を取り出し、条件関数が指定されている場合 (つまり null でない場合) は、その接続を条件関数で検査します。条件関数は、このルーチンと同じスレッドで実行する必要があります。条件関数が CF_ACCEPT を返すと、LPWSPAccept は新しいソケットを作成します。
新しく作成されたソケットは、LPWSPAsyncSelect または LPWSPEventSelect で登録されたネットワークイベントを含め、ソケット s と同じプロパティを持ちます。DescriptorAllocation で説明されているとおり、新しいソケット記述子を割り当てるときには、IFS プロバイダーは WPUModifyIFSHandle を、IFS 以外のプロバイダーは WPUCreateSocketHandle を呼び出す必要があります。
条件関数が CF_REJECT を返した場合、LPWSPAccept は接続要求を拒否します。アプリケーションが受け入れ/拒否の判断を直ちに行えない場合、条件関数は判断が行われていないことを示す CF_DEFER を返します。この接続要求について、サービスプロバイダーは何の処理も行いません。アプリケーションは、接続要求に対して処理を行う準備ができた時点で LPWSPAccept を再度呼び出し、条件関数の戻り値として CF_ACCEPT または CF_REJECT を返します。
(既定の) ブロッキングモードのソケットでは、キューに保留中の接続がない場合、LPWSPAccept は接続が現れるまで呼び出し元をブロックします。非ブロッキングモードのソケットでは、キューに保留中の接続がないときにこの関数が呼び出されると、LPWSPAccept はエラーコード WSAEWOULDBLOCK を返します。受け入れたソケットを、さらに接続を受け入れるために使用することはできません。元のソケットは開いたままです。
addr パラメーターは、接続元のエンティティのアドレス (サービスプロバイダーが認識しているもの) が設定される結果パラメーターです。addr パラメーターの正確な形式は、通信が行われているアドレスファミリーによって決まります。addrlen は値と結果を兼ねるパラメーターで、最初は addr が指す領域のサイズを格納します。復帰時には、サービスプロバイダーが返したアドレスの実際の長さ (バイト単位) が格納されている必要があります。この呼び出しは、SOCK_STREAM などのコネクション指向のソケット型で使用します。addr と addrlen のいずれか、または両方が null の場合、受け入れたソケットのリモートアドレスに関する情報は返されません。それ以外の場合、これら 2 つのパラメーターは、条件関数が指定されているかどうかや、その戻り値に関係なく設定されます。
条件関数のプロトタイプは次のとおりです。
int CALLBACK
ConditionFunc(
IN LPWSABUF lpCallerId,
IN LPWSABUF lpCallerData,
IN OUT LPQOS lpSQOS,
IN OUT LPQOS lpGQOS,
IN LPWSABUF lpCalleeId,
IN LPWSABUF lpCalleeData,
OUT GROUP FAR * g,
IN DWORD_PTR dwCallbackData
);
lpCallerId と lpCallerData は値パラメーターで、接続元のエンティティのアドレスと、接続要求とともに送信されたユーザーデータを格納している必要があります。呼び出し元の識別子や呼び出し元のデータが利用できない場合、対応するパラメーターは null になります。多くのネットワークプロトコルは、接続時の呼び出し元データをサポートしていません。一般的なネットワークプロトコルのほとんどは、接続要求時に呼び出し元の識別子情報をサポートしていると考えられます。lpCallerId が指す WSABUF の buf 部分は、sockaddr を指します。sockaddr は、そのアドレスファミリーに従って解釈されます (通常は sockaddr をアドレスファミリー固有の型にキャストします)。
lpSQOS パラメーターは、呼び出し元が指定したソケット s のフロー仕様 (各方向に 1 つずつ) と、それに続くプロバイダー固有の追加パラメーターを参照します。単方向のソケットでは、送信側または受信側のフロー仕様の値は適宜無視されます。lpSQOS が null の場合は、呼び出し元から指定された QoS がなく、ネゴシエーションも行えないことを示します。lpSQOS ポインターが NULL 以外の場合は、QoS ネゴシエーションが行われること、またはプロバイダーがネゴシエーションなしで QoS 要求を受け入れる用意があることを示します。
lpCalleeId は、接続先エンティティのローカルアドレスを格納する値パラメーターです。lpCalleeId が指す WSABUF の buf 部分は、sockaddr を指します。sockaddr は、そのアドレスファミリーに従って解釈されます (通常は sockaddr をアドレスファミリー固有の型にキャストします)。
lpCalleeData は、条件関数が接続元のエンティティにユーザーデータを返すために使用する結果パラメーターです。このデータ用の記憶域は、サービスプロバイダーが用意する必要があります。lpCalleeData->len には、最初はサービスプロバイダーが割り当てて lpCalleeData->buf が指しているバッファーの長さが格納されています。値が 0 の場合は、呼び出し元へのユーザーデータの返送がサポートされていないことを意味します。条件関数は、最大 lpCalleeData->len バイトのデータを lpCalleeData->buf にコピーし、その後 lpCalleeData->len を実際に転送したバイト数に更新します。呼び出し元に返すユーザーデータがない場合、条件関数は lpCalleeData->len を 0 に設定します。すべてのアドレスおよびユーザーデータの形式は、そのソケットが属するアドレスファミリーに固有です。
条件関数に渡される dwCallbackData パラメーターの値は、元の LPWSPAccept の呼び出しで dwCallbackData パラメーターとして渡された値です。この値は Windows Sockets 2 クライアントによってのみ解釈されます。これにより、クライアントは LPWSPAccept の呼び出し箇所から条件関数へコンテキスト情報を渡すことができ、接続を受け入れるかどうかの判断に必要な追加情報を条件関数に提供できます。典型的な用途は、このソケットに関連付けられたアプリケーション定義のオブジェクトへの参照を含むデータ構造への (適切にキャストした) ポインターを渡すことです。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)