LPWSPSELECT
コールバックシグネチャ
INT LPWSPSELECT(
INT nfds,
FD_SET* readfds,
FD_SET* writefds,
FD_SET* exceptfds,
TIMEVAL* timeout,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| nfds | INT | 無視されます。互換性のためにのみ含まれています。 |
| readfds | FD_SET* | 読み取り可能かどうかを調べるソケットの集合への省略可能なポインター。 |
| writefds | FD_SET* | 書き込み可能かどうかを調べるソケットの集合への省略可能なポインター。 |
| exceptfds | FD_SET* | エラーの有無を調べるソケットの集合への省略可能なポインター。 |
| timeout | TIMEVAL* | LPWSPSelect が待機する最大時間を、timeval 構造体の形式で指定します。ブロッキング操作にする場合は null を指定します。 |
| lpErrno | INT* | エラーコードへのポインター。 |
公式ドキュメント
LPWSPSelect 関数は、1 つ以上のソケットの状態を判定します。
戻り値
LPWSPSelect 関数は、準備が整っていて fd_set 構造体に含まれているディスクリプターの総数を返します。エラーが発生した場合は SOCKET_ERROR を返します。戻り値が SOCKET_ERROR の場合、具体的なエラーコードは lpErrno で取得できます。
| エラーコード | 意味 |
|---|---|
| Windows Sockets サービスプロバイダーが内部処理に必要なリソースを割り当てられませんでした。または、readfds、writefds、exceptfds、timeval の各パラメーターがユーザーアドレス空間の一部ではありません。 | |
| ネットワークサブシステムに障害が発生しました。 | |
| timeout の値が無効であるか、3 つのディスクリプターパラメーターがすべて NULL でした。 | |
| (ブロッキング) 呼び出しが LPWSPCancelBlockingCall によってキャンセルされました。 | |
| ブロッキングの Windows Sockets 呼び出しが進行中であるか、サービスプロバイダーがコールバック関数をまだ処理しています。 | |
| ディスクリプターの集合のいずれかに、ソケットではないエントリが含まれています。 |
解説(Remarks)
この関数は、1 つ以上のソケットの状態を判定するために使用します。呼び出し元は、ソケットごとに読み取り、書き込み、またはエラーの状態に関する情報を要求できます。特定の状態を要求するソケットの集合は、fd_set 構造体で示します。fd_set 内のすべてのエントリは、当該サービスプロバイダーが作成したソケットに対応します (つまり、それらのプロトコルを記述する WSAPROTOCOL_INFO 構造体が同じ providerId 値を持ちます)。呼び出しから戻ると、これらの構造体は指定された条件を満たすソケットの部分集合を反映するように更新され、LPWSPSelect は条件を満たすソケットの総数を返します。fd_set を操作するための一連のマクロが用意されています。これらのマクロは Berkeley ソフトウェアで使用されているものと互換性がありますが、内部表現はまったく異なります。
パラメーター readfds は、読み取り可能かどうかを調べるソケットを指定します。ソケットが LPWSPListen によって現在リッスンしている場合、着信接続要求を受信していれば読み取り可能としてマークされ、LPWSPAccept がブロックせずに完了することが保証されます。その他のソケットでは、読み取り可能とは、キューに入れられたデータが読み取れる状態にあり、LPWSPRecv または LPWSPRecvFrom がブロックしないことが保証されることを意味します。
コネクション指向のソケットでは、読み取り可能であることが、ピアからクローズ要求を受信したことを示す場合もあります。仮想回線が正常にクローズされた場合、LPWSPRecv は読み取りバイト数 0 で直ちに戻ります。仮想回線がリセットされた場合、LPWSPRecv は WSAECONNRESET などのエラーコードで直ちに完了します。OOB データの有無は、ソケットオプション SO_OOBINLINE が有効になっている場合に確認されます (LPWSPSetSockOpt を参照)。
パラメーター writefds は、書き込み可能かどうかを調べるソケットを指定します。
- ソケットが LPWSPConnect によって接続処理中の場合、書き込み可能とは、接続の確立が正常に完了したことを意味します。
- ソケットが LPWSPConnect による待機処理中でない場合、書き込み可能とは、LPWSPSend または LPWSPSendTo が成功することが保証されることを意味します。
ただし、len が利用可能な送信側システムバッファーの空き容量を超える場合は、ブロッキングソケットでブロックすることがあります。これらの保証がどれだけの期間有効とみなせるかは、特にマルチスレッド環境では規定されていません。
パラメーター exceptfds は、OOB データの有無や例外的なエラー条件の有無を調べるソケットを指定します。この方法で OOB データが通知されるのは、オプション SO_OOBINLINE が FALSE の場合だけである点に注意してください。ソケットが LPWSPConnect による (非ブロッキングの) 接続を行っている場合、接続試行の失敗は exceptfds で示されます。他にどのエラーが含まれるかは、この仕様では定義されていません。
対象の条件について調べるディスクリプターがない場合、readfds、writefds、exceptfds のうち任意の 2 つを null にできます。少なくとも 1 つは null 以外である必要があり、null 以外のディスクリプターの集合には、少なくとも 1 つのソケットディスクリプターが含まれている必要があります。
まとめ: LPWSPSelect から戻ったとき、ソケットは次に従って特定の集合に含められます。
| パラメーター | 説明 |
|---|---|
| readfds: | LPWSPListen が呼び出されている場合、接続が保留中であり、LPWSPAccept が成功します。読み取り可能なデータがあります (SO_OOBINLINE が有効な場合は OOB データを含む)。接続がクローズ/リセット/終了されました。 |
| writefds: | LPWSPConnect (非ブロッキング) の場合、接続が成功しました。データを送信できます。 |
| exceptfds: | LPWSPConnect (非ブロッキング) の場合、接続試行が失敗しました。読み取り可能な OOB データがあります (SO_OOBINLINE が無効な場合のみ)。 |
ディスクリプターの集合を操作および検査するために、ヘッダーファイル Ws2spi.h には 3 つのマクロと 1 つのアップコール関数が定義されています。変数 FD_SETSIZE は、1 つの集合に含められるディスクリプターの最大数を決定します。(FD_SETSIZE の既定値は 64 であり、Ws2spi.h を #include する前に FD_SETSIZE を別の値に #define することで変更できます。) 内部的には、fd_set 内のソケットハンドルは Berkeley UNIX のようなビットフラグとしては表現されません。そのデータ表現は不透明です。これらのマクロを使用することで、異なるソケット環境間でのソフトウェアの移植性が保たれます。
fd_set の内容を操作および検査するマクロは次のとおりです。
-
FD_CLR(s, *set)
-
ディスクリプター s を set から削除します。
-
FD_SET(s, *set)
-
ディスクリプター s を set に追加します。
-
FD_ZERO(*set)
-
set を null の集合に初期化します。
メンバーであるかどうかを検査するために使用するアップコール関数は次のとおりです。
-
intWPUFDIsSet (SOCKETs, FD_SET FAR *set);
-
この関数は、s が set のメンバーであれば 0 以外を返し、そうでなければ 0 を返します。
パラメーター timeout は、LPWSPSelect の完了までにかけられる時間を制御します。timeout が null ポインターの場合、LPWSPSelect は少なくとも 1 つのディスクリプターが指定された条件を満たすまで無期限にブロックします。それ以外の場合、timeout は、LPWSPSelect が戻るまでに待機する最大時間を指定する timeval 構造体を指します。LPWSPSelect が戻るとき、timeval 構造体の内容は変更されません。timeval が {0, 0} に初期化されている場合、LPWSPSelect は直ちに戻ります。これは、選択したソケットの状態をポーリングするために使用します。この場合、LPWSPSelect の呼び出しは非ブロッキングとみなされ、非ブロッキング呼び出しに対する標準的な前提が適用されます。たとえば、ブロッキングフックは呼び出されず、Windows Sockets プロバイダーは制御を譲りません。
LPWSPSelect 関数は、LPWSPAsyncSelect または LPWSPEventSelect で登録されたソケットイベントの永続性には影響しません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)