次の方法で共有


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 ソケット サービス プロバイダーは、内部操作に必要なリソースを割り当てることができませんでした。または、readfdswritefdsexceptfds、または timeval パラメーターがユーザー アドレス空間の一部ではありません。
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 (非ブロッキング) 接続を行っている場合、接続試行の失敗は、を除いて示されます。 この仕様では、含めるその他のエラーは定義されていません。

任意の 2 つの readfdswritefds、または exceptfds は、関心のある状態を確認する記述子がない場合 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(s, *set)

セットから記述子 削除します。

FD_SET(s, *set)

セットに記述子 追加します。

FD_ZERO(*set)

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

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

intWPUFDIsSet (SOCKETs, FD_SET FAR *set);

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

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

手記

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

必要条件

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

関連項目

LPWSPAccept の

LPWSPConnect を する

LPWSPEventSelect の

LPWSPRecv を する

LPWSPRecvFrom

LPWSPSend を する

LPWSPSendTo