次の方法で共有


LPWSPACCEPT コールバック関数 (ws2spi.h)

LPWSPAccept 関数は、条件関数の戻り値に基づいて、条件付きで接続を受け入れます。

構文

LPWSPACCEPT Lpwspaccept;

SOCKET Lpwspaccept(
  [in]      SOCKET s,
  [out]     sockaddr *addr,
  [in, out] LPINT addrlen,
  [in]      LPCONDITIONPROC lpfnCondition,
  [in]      DWORD_PTR dwCallbackData,
  [out]     LPINT lpErrno
)
{...}

パラメーター

[in] s

LPWSPListen後に接続をリッスンしているソケットを識別する記述子。

[out] addr

サービス プロバイダーに知られているように、接続エンティティのアドレスを受け取るバッファーへの省略可能なポインター。 addr パラメーターの正確な形式は、sockaddr 構造体のソケットが作成されたときに確立されたアドレス ファミリによって決まります。

[in, out] addrlen

addr パラメーターの長さをバイト単位で格納する整数への省略可能なポインター。

[in] lpfnCondition

Windows ソケットによって提供されるオプション条件関数のプロシージャ インスタンス アドレス。 この関数は、パラメーターとして渡された呼び出し元情報に基づいて、受け入れまたは拒否の決定で使用されます。

[in] dwCallbackData

条件関数の dwCallbackData パラメーターの値として Windows Socket 2 クライアントに返されるコールバック データ。 このパラメーターは、サービス プロバイダーによって解釈されません。

[out] lpErrno

エラー コードへのポインター。

戻り値

エラーが発生しない場合、LPWSPAccept は、受け入れられたソケットの記述子である SOCKET 型の値を返します。 それ以外の場合は、INVALID_SOCKETの値が返され、lpErrnoで特定のエラー コード 使用できます。

エラー コード 意味
WSAECONNREFUSED の
条件関数 (CF_REJECT) の戻り値で示されているように、接続要求が強制的に拒否されました。
WSAECONNRESET の
着信接続が示されましたが、その後、呼び出しを受け入れる前にリモート ピアによって終了されました。
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEFAULT の
addrlen パラメーターが小さすぎるか、lpfnCondition パラメーターがユーザー アドレス空間の一部ではありません。
WSAEINTR の
LPWSPCancelBlockingCallを通じて (ブロッキング) 呼び出しが取り消されました。
WSAEINPROGRESS を する
ブロックしている Windows ソケット呼び出しが進行中です。
WSAEINVAL の
LPWSPAccept より前に LPWSPListen が呼び出されなかった 、条件関数で指定されたパラメーター g が有効な値ではない、条件関数の戻り値が有効でない、または指定されたソケットが無効な状態である場合。
WSAEMFILE の
LPWSPAccept への入力時にキューが空でなく、使用可能なソケット記述子がありません。
WSAENOBUFS の
使用できるバッファー領域はありません。
WSAENOTSOCK の
記述子はソケットではありません。
WSAEOPNOTSUPP の
参照されるソケットは、接続指向サービスをサポートする型ではありません。
WSATRY_AGAIN
接続要求の受け入れは、条件関数 (CF_DEFER) の戻り値で示されているように遅延されました。
WSAEWOULDBLOCK を する
ソケットは非ブロッキングとしてマークされ、受け入れられる接続はありません。
WSAEACCES の
提供された接続要求がタイムアウトしたか、取り消されました。

備考

LPWSPAccept 関数は、ソケット sで保留中の接続のキュー上の最初の接続を抽出し、条件関数が指定されている場合 (つまり、null ではない) 条件関数と照合します。 条件関数は、このルーチンと同じスレッドで実行する必要があります。 条件関数がCF_ACCEPTを返す場合は、LPWSPAccept 新しいソケットを作成します。

新しく作成されたソケットには、LPWSPAsyncSelect または LPWSPEventSelectで登録されたネットワーク イベント 含む、ソケット と同じプロパティがあります。 DescriptorAllocationで説明されているように、新しいソケット記述子が割り当てられると、IFS プロバイダーは WPUModifyIFSHandle 呼び出す必要があり、IFS 以外のプロバイダーは WPUCreateSocketHandle呼び出す必要があります。

条件関数がCF_REJECTを返す場合は、LPWSPAccept 接続要求を拒否します。 アプリケーションの承諾/拒否の決定を直ちに行うことができない場合、条件関数は決定が行われなかったことを示すCF_DEFERを返します。 この接続要求に関するアクションは、サービス プロバイダーによって実行されません。 アプリケーションは、接続要求に対してアクションを実行する準備ができたら、LPWSPAccept 再度呼び出し、条件関数から戻り値としてCF_ACCEPTまたはCF_REJECTを返します。

(既定の) ブロック モードのソケットの場合、保留中の接続がキューに存在しない場合、LPWSPAccept 接続が存在するまで呼び出し元をブロックします。 非ブロッキング モードのソケットの場合、保留中の接続がキューに存在しないときにこの関数が呼び出された場合、LPWSPAccept は WSAEWOULDBLOCKエラー コードを返します。 受け入れられたソケットを使用して、より多くの接続を受け入れることはできません。 元のソケットは開いたままです。

addr パラメーターは、接続エンティティのアドレス (サービス プロバイダーに知られている) が入力された結果パラメーターです。 addr パラメーターの正確な形式は、通信が行われているアドレス ファミリによって決まります。 addrlen は値の結果パラメーターです。最初は、addrによって指 領域の量が格納されます。返された場合、サービス プロバイダーによって返されるアドレスの実際の長さ (バイト単位) が含まれている必要があります。 この呼び出しは、SOCK_STREAMなどの接続指向のソケット型で使用されます。 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
);

lpCallerIdlpCallerData は、接続エンティティのアドレスと、接続要求と共に送信されたすべてのユーザー データを含む必要がある値パラメーターです。 呼び出し元識別子または呼び出し元データが使用できない場合、対応するパラメーターは null になります。 多くのネットワーク プロトコルでは、接続時の呼び出し元データはサポートされていません。 ほとんどの従来のネットワーク プロトコルでは、接続要求時に呼び出し元識別子情報をサポートすることが期待できます。 buf WSABUF の一部 lpCallerId が指 sockaddrを指しています。 sockaddr は、アドレス ファミリに従って解釈されます (通常は、sockaddr をアドレス ファミリに固有の型にキャストします)。

lpSQOS パラメーターは、呼び出し元によって指定されたソケット のフロー仕様を参照します。各方向に 1 つずつ、さらにプロバイダー固有のパラメーターが続きます。 送信側または受信フローの指定値は、単一方向ソケットに対して適切に無視されます。 lpSQOS の null 値は、呼び出し元が指定した QoS がなく、ネゴシエーションが不可能であることを示します。 lpSQOS ポインターNULL は、QoS ネゴシエーションが発生すること、またはプロバイダーがネゴシエーションなしで QoS 要求を受け入れる準備ができていることを示します。

lpCalleeId は、接続されたエンティティのローカル アドレスを含む値パラメーターです。 bufWSABUF の一部 lpCalleeId が指sockaddrを指しています。 sockaddr は、アドレス ファミリに従って解釈されます (通常は、sockaddr をアドレス ファミリに固有の型にキャストします)。

lpCalleeData は、接続エンティティにユーザー データを返すために条件関数によって使用される結果パラメーターです。 このデータのストレージは、サービス プロバイダーによって提供される必要があります。 lpCalleeData-len には、最初にサービス プロバイダーによって割り当てられ、lpCalleeData-bufによって指 バッファーの長さが含まれます。 値が 0 の場合は、呼び出し元にユーザー データを戻すことがサポートされていないことを意味します。 condition 関数は、最大 lpCalleeData-len バイトのデータを lpCalleeData-bufにコピーし、lpCalleeData-len 更新して、転送された実際のバイト数を示します。 呼び出し元にユーザー データを返さない場合、条件関数は lpCalleeData-len ゼロに設定します。 すべてのアドレスとユーザー データの形式は、ソケットが属するアドレス ファミリに固有です。

条件関数に渡される dwCallbackData パラメーター値は、元の LPWSPAccept 呼び出しで dwCallbackData パラメーターとして渡される値です。 この値は、Windows Sockets 2 クライアントによってのみ解釈されます。 これにより、クライアントは、LPWSPAccept 呼び出しサイトから条件関数にコンテキスト情報を渡すことができます。これにより、接続を受け入れるかどうかを判断するために必要な追加情報が条件関数に提供されます。 一般的な使用法は、このソケットが関連付けられているアプリケーション定義オブジェクトへの参照を含むデータ構造に (適切にキャストされた) ポインターを渡すことです。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされる最小サーバー Windows 2000 Server [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー ws2spi.h

関連項目

LPWSPAsyncSelect の

LPWSPBind の

LPWSPConnect を する

LPWSPEventSelect の

LPWSPGetSockOpt の

LPWSPListen を する

LPWSPSelect を する

LPWSPSocket を する