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 ソケット 2 クライアントに返されるコールバック データ。 このパラメーターは、サービス プロバイダーによって解釈されません。

[out] lpErrno

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

戻り値

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

エラー コード 意味
WSAECONNREFUSED
条件関数の戻り値 (CF_REJECT) で示されているように、接続要求が強制的に拒否されました。
WSAECONNRESET
着信接続が示されましたが、その後、呼び出しを受け入れる前にリモート ピアによって終了されました。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEFAULT
addrlen パラメーターが小さすぎるか、lpfnCondition パラメーターがユーザー アドレス空間の一部ではありません。
WSAEINTR
(ブロッキング) 呼び出しが LPWSPCancelBlockingCall によって取り消されました。
WSAEINPROGRESS
ブロックしている Windows ソケット呼び出しが進行中です。
WSAEINVAL
LPWSPListen が LPWSPAccept より前に呼び出されませんでした。条件関数で指定されたパラメーター 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 などの接続指向のソケット型で使用されます。 addraddrlen が 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 になります。 多くのネットワーク プロトコルでは、接続時の呼び出し元データはサポートされていません。 ほとんどの従来のネットワーク プロトコルでは、接続要求時に呼び出し元識別子情報をサポートすることが期待できます。 lpCallerId が指す WSABUFbuf 部分は sockaddr を指します。 sockaddr はそのアドレス ファミリに従って解釈されます (通常は、アドレス ファミリに固有の型に sockaddr をキャストします)。

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

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

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

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

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー ws2spi.h

関連項目

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket