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

LPWSPSelect 関数は、1 つ以上のソケットの状態を判別します。

構文

LPWSPSELECT Lpwspselect;

int Lpwspselect(
  [in]      int nfds,
  [in, out] fd_set *readfds,
  [in, out] fd_set *writefds,
  [in, out] fd_set *exceptfds,
  [in]      const timeval *timeout,
  [out]     LPINT lpErrno
)
{...}

パラメーター

[in] nfds

互換性のためにのみ無視され、含まれます。

[in, out] readfds

読みやすくするためにチェックするソケットのセットへのオプションのポインター。

[in, out] writefds

書き込み可能かどうかを確認するソケットのセットへのオプションのポインター。

[in, out] exceptfds

エラーをチェックするソケットのセットへのオプションのポインター。

[in] timeout

LPWSPSelect が待機する最大時間。ブロック操作の場合は null (timeval 構造体の形式)。

[out] lpErrno

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

戻り値

LPWSPSelect 関数は、準備ができて、fd_set構造体に含まれている記述子の合計数を返します。エラーが発生した場合はSOCKET_ERROR。 戻り値がSOCKET_ERROR場合は、 lpErrno で特定のエラー コードを使用できます。

エラー コード 意味
WSAEFAULT
Windows Sockets サービス プロバイダーは、内部操作に必要なリソースを割り当てることができませんでした。または 、readfdswritefdsexceptfdstimeval パラメーターがユーザー アドレス空間の一部ではありません。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEINVAL
タイムアウト値が無効であるか、3 つの記述子パラメーターがすべて NULL でした。
WSAEINTR
(ブロッキング) 呼び出しは LPWSPCancelBlockingCall を介して取り消されました。
WSAEINPROGRESS
Windows ソケット呼び出しのブロックが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAENOTSOCK
記述子セットの 1 つに、ソケットではないエントリが含まれています。

注釈

この関数は、1 つ以上のソケットの状態を判断するために使用されます。 ソケットごとに、呼び出し元は読み取り、書き込み、またはエラーの状態に関する情報を要求できます。 特定の状態が要求されるソケットのセットは、 fd_set 構造体によって示されます。 fd_set内のすべてのエントリは、サービス プロバイダーによって作成されたソケットに対応します (つまり、プロトコルを記述するWSAPROTOCOL_INFO構造体の providerId 値は同じです)。 戻り時に、指定された条件を満たすこれらのソケットのサブセットを反映するように構造体が更新され、 LPWSPSelect は条件を満たすソケットの合計数を返します。 fd_setを操作するための一連のマクロが用意されています。 これらのマクロは、バークレイソフトウェアで使用されているものと互換性がありますが、基になる表現はまったく異なります。

パラメーター readfds は、 読みやすさを確認するソケットを識別します。 ソケットが現在 LPWSPListen を介してリッスンしている場合は、受信接続要求を受信した場合に読み取り可能としてマークされます。そのため、 LPWSPAccept はブロックせずに完了することが保証されます。 他のソケットの場合、読みやすさとは、LPWSPRecv または LPWSPRecvFrom がブロックされないことが保証されるように、キューに入ったデータを読み取り可能であることを意味します。

接続指向ソケットの場合、読みやすさは、ピアからクローズ要求が受信されたことを示すこともできます。 仮想回線が正常に閉じられた場合、 LPWSPRecv は読み取られた 0 バイトで直ちにを返します。 仮想回線がリセットされた場合、 LPWSPRecv はすぐに完了し、WSAECONNRESET などのエラー コードが表示されます。 ソケット オプション SO_OOBINLINEが有効になっている場合は、OOB データの存在が確認されます ( LPWSPSetSockOpt を参照)。

パラメーター writefds は、 書き込み可能かどうかを確認するソケットを識別します。

  • ソケットが LPWSPConnect を介して接続している場合、書き込み可能とは、接続の確立が正常に完了したことを意味します。
  • ソケットが LPWSPConnect を介してリッスン中でない場合、書き込み可能性は LPWSPSend または LPWSPSendTo が成功することが保証されることを意味します。

ただし、 len が使用可能な出力システム バッファー領域の量を超えると、ブロッキング ソケットでブロックできます。 特にマルチスレッド環境では、これらの保証が有効であると想定できる期間は指定されていません。

exceptfds パラメーターは、OOB データの存在または例外的なエラー条件をチェックするソケットを識別します。 OOB データは、オプション SO_OOBINLINEが FALSE の場合にのみ、この方法で報告されることに注意 してください。 ソケットが LPWSPConnect (非ブロッキング) 接続を確立している場合、接続試行の失敗は exceptfds で示されます。 この仕様では、他のどのエラーを含めるかは定義されていません。

関心のある条件を検査する記述子がない場合は、 readfdswritefds、または exceptfds の 2 つを null として指定できます。 少なくとも 1 つは null 以外である必要があり、null 以外の記述子セットには少なくとも 1 つのソケット記述子が含まれている必要があります。

概要: LPWSPSelect が次に従って戻るときに、ソケットは特定のセットで識別されます。

パラメーター 説明
readfds: LPWSPListen が呼び出された場合、接続は保留中です。LPWSPAccept は成功します。データは読み取り可能です (SO_OOBINLINEが有効になっている場合は OOB データが含まれます)。接続が閉じられている/リセット/終了されました。
writefds: LPWSPConnect (非ブロッキング) の場合、接続は成功しました。データを送信できます。
exceptfds: LPWSPConnect (非ブロッキング) の場合、接続の試行に失敗しました。OOB データは読み取りに使用できます (SO_OOBINLINEが無効になっている場合のみ)。

 

 

記述子セットを操作およびチェックするために、3 つのマクロと 1 つの upcall 関数がヘッダー ファイル Ws2spi.h に定義されています。 変数FD_SETSIZEは、セット内の記述子の最大数を決定します。 (FD_SETSIZE の既定値は 64 です。これは、ws2spi.h を #including する前に別の値に #defining FD_SETSIZE することで変更できます)。内部的には、 fd_set 内のソケット ハンドルは、バークレイ UNIX のようにビット フラグとして表されません。 データ表現は不透明です。 これらのマクロを使用すると、異なるソケット環境間のソフトウェアの移植性が維持されます。

fd_setの内容を操作およびチェックするマクロは次のとおりです。

FD_CLR、*set)

set から記述子 s を削除します。

FD_SET、*set)

設定する記述子 s を追加します。

FD_ZERO(*set)

セットを nullセットに初期化します。

メンバーシップをチェックするために使用される upcall 関数は次のとおりです。

intWPUFDIsSet (SOCKETs, FD_SET FAR *set);

s がセットのメンバーである場合は 0 以外の値を返し、それ以外の場合は 0 を返します。

パラメーター タイムアウト は、 LPWSPSelect が完了するまでの時間を制御します。 timeoutnull ポインターの場合、LPWSPSelect は、少なくとも 1 つの記述子が指定された条件を満たすまで無期限にブロックされます。 それ以外の場合、タイムアウトは、戻る前に LPWSPSelect が待機する最大時間を指定する timeval 構造体を指します。 LPWSPSelect が戻るとき、timeval 構造体の内容は変更されません。 timeval が {0, 0} に初期化されている場合、LPWSPSelect はすぐに返されます。これは、選択したソケットの状態をポーリングするために使用されます。 この場合、 LPWSPSelect 呼び出しは非ブロッキングと見なされ、非ブロッキング呼び出しの標準的な前提条件が適用されます。 たとえば、ブロッキング フックは呼び出されず、Windows ソケット プロバイダーは生成されません。

注意

LPWSPSelect 関数は、LPWSPAsyncSelect または LPWSPEventSelect に登録されているソケット イベントの永続化には影響しません。

要件

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

こちらもご覧ください

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo