select 関数は、同期 I/O を実行するために必要に応じて待機する 1 つ以上のソケットの状態を決定します。
構文
int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
パラメーター
[in] nfds
無視されます。 nfds パラメーターは、Berkeley ソケットとの互換性のためにのみ含まれます。
[in, out] readfds
読みやすさを確認するソケットのセットへの省略可能なポインター。
[in, out] writefds
書き込み可能かどうかを確認するソケットのセットへの省略可能なポインター。
[in, out] exceptfds
エラーをチェックするソケットのセットへの省略可能なポインター。
[in] timeout
TIMEVAL 構造体の形式で指定された、待機する選択の最大時間。 ブロッキング操作の 場合は、タイムアウト パラメーターを null に設定します。
戻り値
select 関数は、準備完了でfd_set構造体に含まれているソケット ハンドルの合計数、期限切れの場合は 0、エラーが発生した場合はSOCKET_ERRORを返します。 戻り値がSOCKET_ERROR場合、 WSAGetLastError を使用して特定のエラー コードを取得できます。
| エラー コード | Meaning |
|---|---|
| この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。 | |
| Windows ソケットの実装では、その内部操作に必要なリソースを割り当てることができませんでした。または、 readfds、 writefds、 exceptfds、または timeval パラメーターがユーザー アドレス空間の一部ではありません。 | |
| ネットワーク サブシステムが失敗しました。 | |
| タイムアウト値が無効な場合、または 3 つの記述子パラメーターがすべて null ポインターであるか、ソケットを含まない空のfd_set構造体への有効なポインターである場合、WSAEINVAL が返されます。 | |
| WINDOWS ソケット 1.1 の呼び出しのブロックが WSACancelBlockingCall を通じて取り消されました。 | |
| ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
| 記述子セットの 1 つに、ソケットではないエントリが含まれています。 |
注釈
select 関数は、1 つ以上のソケットの状態を判別するために使用されます。 各ソケットについて、呼び出し元は読み取り、書き込み、またはエラーの状態に関する情報を要求できます。 特定の状態が要求されるソケットのセットは、 fd_set 構造体によって示されます。 fd_set構造体に含まれるソケットは、1 つのサービス プロバイダーに関連付ける必要があります。 この制限のために、ソケットのプロトコルを記述する WSAPROTOCOL_INFO 構造体の providerId 値が同じである場合、ソケットは同じサービス プロバイダーからのものと見なされます。 戻ると、構造体は、指定された条件を満たすこれらのソケットのサブセットを反映するように更新されます。 select 関数は、条件を満たすソケットの数を返します。 fd_set構造体を操作するための一連のマクロが用意されています。 これらのマクロは、バークレイソフトウェアで使用されているものと互換性がありますが、基になる表現はまったく異なります。
パラメーター readfds は、 読みやすさをチェックするソケットを識別します。 ソケットが現在 リッスン 状態にある場合は、受信接続要求が受信された場合に読み取り可能としてマークされます。これにより、 受け入れ はブロックなしで完了することが保証されます。 他のソケットの場合、読みやすさとは、recv、WSARecv、WSARecvFrom、または recvfrom の呼び出しがブロックされないことが保証されるように、キューに格納されたデータを読み取ることができることを意味します。
接続指向ソケットの場合、読みやすさは、ソケットを閉じる要求がピアから受信されたことを示すこともできます。 仮想回線が正常に閉じられ、すべてのデータが受信された場合、 recv は読み取られた 0 バイトで直ちに返されます。 仮想回線がリセットされた場合、 RECV はすぐに完了し、 WSAECONNRESET などのエラー コードが表示されます。 ソケット オプション SO_OOBINLINEが有効になっている場合、OOB データの存在がチェックされます ( setsockopt を参照)。
パラメーター writefds は、 書き込み可能かどうかをチェックするソケットを識別します。 ソケットが 接続 呼び出しを処理している場合 (非ブロッキング)、接続の確立が正常に完了した場合、ソケットは書き込み可能です。 ソケットが 接続 呼び出しを処理していない場合、書き込み可能性は 、送信、 送信、または WSASendto が成功することが保証されていることを意味します。 ただし、 len パラメーターが使用可能な送信システム バッファー領域の量を超えると、ブロック ソケットでブロックされる可能性があります。 特にマルチスレッド環境では、これらの保証が有効であると想定できる期間は指定されていません。
exceptfds パラメーターは、OOB データまたは例外エラー条件の有無を検査するソケットを識別します。
要約すると、 select が次の場合に戻るときに、特定のセットでソケットが識別されます。
readfds:
- リッスンが呼び出され、接続が保留中の場合、accept は成功します。
- データは読み取り可能です (SO_OOBINLINEが有効になっている場合は OOB データが含まれます)。
- 接続が閉じられた/リセット/終了されました。
- 接続呼び出しの処理 (非ブロッキング) の場合、接続は成功しました。
- データを送信できます。
- 接続呼び出しの処理 (非ブロッキング) の場合、接続の試行に失敗しました。
- OOB データは読み取り可能です (SO_OOBINLINEが無効になっている場合のみ)。
- FD_ZERO(*set) - 空のセットに設定を初期化します。 使用する前に、常にセットをクリアする必要があります。
- FD_CLR、*set) - セットからソケットを削除します。
- FD_ISSET、*set) - s がセットのメンバーであるかどうかを確認し、その場合は TRUE を返します。
- FD_SET、*set) - 設定 するソケットを追加します。
パラメーター のタイムアウト は、 選択 が完了するまでの時間を制御します。 タイムアウトが null ポインターの場合、select は、少なくとも 1 つの記述子が指定された条件を満たすまで無期限にブロックされます。 それ以外の場合、タイムアウトは、選択が戻るまでに待機する必要がある最大時間を指定する TIMEVAL 構造体を指します。 select が戻るときに、TIMEVAL 構造体の内容は変更されません。 TIMEVAL が {0, 0} に初期化されている場合、select はすぐに返されます。これは、選択したソケットの状態をポーリングするために使用されます。 select が直ちに返された場合、選択呼び出しは非ブロッキングと見なされ、非ブロッキング呼び出しの標準的な前提条件が適用されます。 たとえば、ブロッキング フックは呼び出されず、Windows ソケットは生成されません。
Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
Requirements
| Requirement | 価値 |
|---|---|
| サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
| サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
| ターゲット プラットフォーム の |
ウィンドウズ |
| Header | winsock2.h |
| Library | Ws2_32.lib |
| DLL | Ws2_32.dll |
こちらも参照ください
を受け入れる