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 を使用して特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAEFAULT
Windows ソケットの実装では、その内部操作に必要なリソースを割り当てることができませんでした。または、 readfdswritefdsexceptfds、または timeval パラメーターがユーザー アドレス空間の一部ではありません。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEINVAL
タイムアウト値が無効であるか、3 つの記述子パラメーターがすべて null でした
WSAEINTR
ブロックしている Windows ソケット 1.1 呼び出しが WSACancelBlockingCall によって取り消されました。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAENOTSOCK
記述子セットの 1 つに、ソケットではないエントリが含まれています。

注釈

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

パラメーター readfds は、 読みやすさを確認するソケットを識別します。 ソケットが現在 リッスン 状態にある場合は、受信接続要求が受信された場合に読み取り可能としてマークされます。これにより、 受け入れ はブロックなしで完了することが保証されます。 他のソケットの場合、読みやすさとは、recv、WSARecv、WSARecvFrom、または recvfrom の呼び出しがブロックされないことが保証されるように、キューに入ったデータを読み取るために使用できるということです。

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

パラメーター writefds は、 書き込み可能かどうかを確認するソケットを識別します。 ソケットが 接続 呼び出し (非ブロッキング) を処理している場合、接続の確立が正常に完了した場合、ソケットは書き込み可能です。 ソケットが 接続 呼び出しを処理していない場合、書き込み可能性は 、送信送信、または WSASendto が成功することが保証されていることを意味します。 ただし、 len パラメーターが使用可能な出力システム バッファー領域の量を超えると、ブロッキング ソケットでブロックできます。 特にマルチスレッド環境では、これらの保証が有効であると想定できる期間は指定されていません。

exceptfds パラメーターは、OOB データの存在または例外的なエラー条件を検査するソケットを識別します。

メモ 帯域外データは、オプション SO_OOBINLINEが FALSE の場合にのみ、この方法で報告されます。 ソケットが 接続 呼び出し (非ブロッキング) を処理している場合、接続試行の失敗は exceptfds に示されます (エラーが発生した理由を示すエラー値を判断するには、アプリケーション で getsockopt SO_ERRORを呼び出す必要があります)。 このドキュメントでは、他のどのエラーを含めるかを定義していません。
 
readfds、writefdsexceptfds のいずれかの 2 つのパラメーターnull として指定できます。 少なくとも 1 つは null 以外である必要があり、null 以外の記述子セットにはソケットへのハンドルが少なくとも 1 つ含まれている必要があります。

要約すると、 select が次の場合に戻るときに、ソケットは特定のセットで識別されます。

readfds:

  • listen が呼び出され、接続が保留中の場合、accept は成功します。
  • データは読み取り可能です (SO_OOBINLINEが有効になっている場合は OOB データが含まれます)。
  • 接続が閉じられている/リセット/終了されました。
writefds:
  • 接続呼び出しの処理 (非ブロッキング) の場合、接続は成功しました。
  • データを送信できます。
exceptfds:
  • 接続呼び出しの処理 (非ブロッキング) の場合、接続の試行は失敗しました。
  • OOB データは読み取りに使用できます (SO_OOBINLINEが無効になっている場合のみ)。
記述子セットを操作およびチェックするために、ヘッダー ファイル Winsock2.h に 4 つのマクロが定義されています。 変数FD_SETSIZEは、セット内の記述子の最大数を決定します。 (FD_SETSIZEの既定値は 64 です。これは、Winsock2.h を含める前に別の値にFD_SETSIZEを定義することで変更できます)。内部的には、 fd_set 構造体内のソケット ハンドルは、バークレイ Unix のようにビット フラグとして表されません。 データ表現は不透明です。 これらのマクロを使用すると、異なるソケット環境間のソフトウェアの移植性が維持されます。 fd_setの内容を操作およびチェックするマクロは次のとおりです。
  • 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 ソケットは生成されません。

メモselect 関数は、WSAAsyncSelect または WSAEventSelect に登録されているソケット イベントの永続化には影響しません。
 
メモタイムアウト パラメーターを NULL に設定した select などのブロック Winsock 呼び出しを発行する場合、Winsock は呼び出しを完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック Winsock 呼び出しを発行すると、未定義の動作が発生し、Winsock クライアントが試行することはできません。
 
Windows Phone 8: この関数は、Windows Phone 8 以降のWindows Phone ストア アプリでサポートされています。

Windows 8.1Windows 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

こちらもご覧ください

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Winsock 関数

Winsock リファレンス

accept

connect

Recv

recvfrom

送信