次の方法で共有


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 パラメーターは、Berkeley ソケットとの互換性のためにのみ含まれます。

[in, out] readfds

読みやすさを確認するソケットのセットへの省略可能なポインター。

[in, out] writefds

書き込み可能かどうかを確認するソケットのセットへの省略可能なポインター。

[in, out] exceptfds

エラーをチェックするソケットのセットへの省略可能なポインター。

[in] timeout

TIMEVAL 構造体の形式で指定された、待機する選択の最大時間。 ブロッキング操作の 場合は、タイムアウト パラメーターを null に設定します。

戻り値

select 関数は、準備完了でfd_set構造体に含まれているソケット ハンドルの合計数、期限切れの場合は 0、エラーが発生した場合はSOCKET_ERRORを返します。 戻り値がSOCKET_ERROR場合、 WSAGetLastError を使用して特定のエラー コードを取得できます。

エラー コード Meaning
WSANOTINITIALIZED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAEFAULT
Windows ソケットの実装では、その内部操作に必要なリソースを割り当てることができませんでした。または、 readfdswritefdsexceptfds、または timeval パラメーターがユーザー アドレス空間の一部ではありません。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEINVAL
タイムアウト値が無効な場合、または 3 つの記述子パラメーターがすべて null ポインターであるか、ソケットを含まない空のfd_set構造体への有効なポインターである場合、WSAEINVAL が返されます。
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 バイトで直ちに返されます。 仮想回線がリセットされた場合、 RECV はすぐに完了し、 WSAECONNRESET などのエラー コードが表示されます。 ソケット オプション 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:

  • リッスンが呼び出され、接続が保留中の場合、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) - セットからソケットを削除します。
  • FD_ISSET、*set) - s がセットのメンバーであるかどうかを確認し、その場合は 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 呼び出しを中断した別のブロック Winsock 呼び出しを APC 内で発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。

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

こちらも参照ください

TIMEVAL

WSAAsyncSelect

WSAEventSelect

Winsock 関数

Winsock リファレンス

を受け入れる

connect

recv

recvfrom

送信