select 関数 (winsock2.h)
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 パラメーターは、Markup ソケットとの互換性のためにのみ含まれています。
[in, out] readfds
読みやすさを確認するソケットのセットへのオプションのポインター。
[in, out] writefds
書き込み可能かどうかを確認するソケットのセットへの省略可能なポインター。
[in, out] exceptfds
エラーをチェックするソケットのセットへの省略可能なポインター。
[in] timeout
TIMEVAL 構造体の形式で指定された、選択が待機する最大時間。 ブロッキング操作の 場合は、timeout パラメーターを null に設定します。
戻り値
select 関数は、準備が整い、fd_set構造体に含まれているソケット ハンドルの合計数、期限が切れた場合は 0、エラーが発生した場合はSOCKET_ERRORを返します。 戻り値がSOCKET_ERROR場合は、 WSAGetLastError を使用して特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。 | |
Windows ソケットの実装では、その内部操作に必要なリソースを割り当てることができませんでした。または、 readfds、 writefds、 exceptfds、または timeval パラメーターがユーザー アドレス空間の一部ではありません。 | |
ネットワーク サブシステムが失敗しました。 | |
タイムアウト値が無効であるか、3 つの記述子パラメーターがすべて null でした。 | |
ブロックしている 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:
- listen が呼び出され、接続が保留中の場合、accept は成功します。
- データは読み取り可能です (SO_OOBINLINEが有効になっている場合は OOB データが含まれます)。
- 接続が閉じられている/リセット/終了されました。
- 接続呼び出しの処理 (非ブロッキング) の場合、接続は成功しました。
- データを送信できます。
- 接続呼び出しの処理 (非ブロッキング) の場合、接続の試行は失敗しました。
- OOB データは読み取りに使用できます (SO_OOBINLINEが無効になっている場合のみ)。
- FD_ZERO(*set) - 空のセットに設定を初期化します。 を使用する前に、常にセットをクリアする必要があります。
- FD_CLR、*set) - ソケットを set から削除します。
- FD_ISSET、*set) - s が set のメンバーであるかどうかを確認し、その場合は 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 ストア アプリでサポートされています。
要件
サポートされている最小のクライアント | Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock2.h |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |