WSAPoll 関数 (winsock2.h)

WSAPoll 関数は、1 つ以上のソケットの状態を決定します。

構文

int WSAAPI WSAPoll(
  [in, out] LPWSAPOLLFD fdArray,
  [in]      ULONG       fds,
  [in]      INT         timeout
);

パラメーター

[in, out] fdArray

状態が要求されるソケットのセットを指定する 1 つ以上の POLLFD 構造体の配列。 配列には、有効なソケットを持つ構造体が少なくとも 1 つ含まれている必要があります。 戻ると、このパラメーターは更新されたソケットを受け取り、状態クエリ条件に一致する各ソケットに revents 状態フラグ メンバーが設定されます。

[in] fds

fdarray 内の WSAPOLLFD 構造体の数。 これは必ずしも、状態が要求されるソケットの数であるとは限りません。

[in] timeout

次の値に基づいて待機動作を指定する 値。

意味
0 より大きい値 待機する時間 (ミリ秒単位)。
ゼロ すぐに返します。
0 より小さい値 無期限に待機します。

戻り値

次のいずれかの値を返します。

戻り値 説明
ゼロ タイマーの有効期限が切れる前に、クエリされた状態のソケットがありませんでした。
0 より大きい値 POLLFD 構造体の revents メンバーが 0 以外である fdarray 内の要素の数。
SOCKET_ERROR エラーが発生しました。 WSAGetLastError 関数を呼び出して、拡張エラー コードを取得します。
 
拡張エラー コード 意味
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEFAULT
ユーザー入力パラメーターの読み取り中に例外が発生しました。
WSAEINVAL
無効なパラメーターが渡されました。 ソケットの状態を要求するときに fdarray パラメーターが指す WSAPOLLFD 構造体の場合、このエラーが返されます。 このエラーは、fdarray パラメーターが指す WSAPOLLFD 構造体の fd メンバーで指定されたソケットがいずれも有効でない場合にも返されます。
WSAENOBUFS
関数で十分なメモリを割り当てることができませんでした。

注釈

WSAPoll 関数は、Windows Vista 以降で定義されています。

WSAPOLLFD 構造体。 アプリケーションは、WSAPOLLFD 構造体の events メンバーに適切なフラグを設定して、対応するソケットごとに要求される状態の種類を指定します。 WSAPoll 関数は、WSAPOLLFD 構造体の revents メンバー内のソケットの状態を返します。

ソケットごとに、呼び出し元は読み取りまたは書き込みの状態に関する情報を要求できます。 エラー条件は常に返されるため、それらに関する情報を要求する必要はありません。

fdarray パラメーターが指す WSAPOLLFD 構造体。 これらの条件を満たせず、エラー条件がないすべてのソケットでは、対応する revents メンバーが 0 に設定されます。

そのソケットの状態を要求するときに、特定のソケットの WSAPOLLFD 構造体で、次のフラグの組み合わせを設定できます。

フラグ 説明
POLLPRI 優先度データは、ブロックせずに読み取られる場合があります。 このフラグは、Microsoft Winsock プロバイダーではサポートされていません。
POLLRDBAND 優先度帯 (帯域外) データは、ブロックせずに読み取られる場合があります。
POLLRDNORM 通常のデータはブロックせずに読み取られる場合があります。
POLLWRNORM 通常のデータはブロックせずに書き込まれる場合があります。
 

POLLIN フラグは、POLLRDNORM フラグ値と POLLRDBAND フラグ値の組み合わせとして定義されます。 POLLOUT フラグは、POLLWRNORM フラグ値と同じとして定義されます。

WSAPOLLFD 構造体には、Winsock プロバイダーでサポートされている上記のフラグの組み合わせのみが含まれている必要があります。 その他の値はエラーと見なされ、 WSAPollSOCKET_ERRORを返します。 その後 WSAGetLastError 関数を呼び出すと、WSAEINVAL の拡張エラー コードが取得されます。 MICROSOFT Winsock プロバイダーのソケットに POLLPRI フラグが設定されている場合、 WSAPoll 関数は失敗します。

ソケットの状態を示すために fdarray パラメーターが指す WSAPOLLFD 構造体の場合:

フラグ 説明
POLLERR 問題が発生しました。
POLLHUP ストリーム指向の接続が切断または中止されました。
POLLNVAL 無効なソケットが使用されました。
POLLPRI 優先度データは、ブロックせずに読み取られる場合があります。 このフラグは、Microsoft Winsock プロバイダーからは返されません。
POLLRDBAND 優先度帯 (帯域外) データは、ブロックせずに読み取られる場合があります。
POLLRDNORM 通常のデータはブロックせずに読み取られる場合があります。
POLLWRNORM 通常のデータはブロックせずに書き込まれる場合があります。
 

TCP および UDP ソケットに関して:

  • WSAPOLLFD 構造体は、通常のデータとして POLLRDNORM として使用されます。
  • WSAPOLLFD 構造体では、後続の recv 操作がブロックされずに完了することが保証されます。
  • POLLWRNORM による WSAPOLLFD 構造体。
  • POLLRDNORM による WSAPOLLFD 構造体。 後続の accept の呼び出しは、ブロックせずに完了することが保証されます。
  • POLLRDBAND による WSAPOLLFD 構造体。
  • WSAPOLLFD 構造体は、リモート ピアが 送信 操作をシャットダウンしたとき (TCP FIN が受信されました)。 後続の recv 関数要求では、0 バイトが返されます。
  • リモート ピアが正常な切断を開始するときの WSAPOLLFD 構造体。
  • リモート ピアが突然切断されると、WSAPOLLFD 構造体が返されます。
  • ローカル ソケットが閉じられたときの WSAPOLLFD 構造体。

fdarray 内の要素 (ソケットではなく) の数は nfds で示されます。 fd メンバーが負の値に設定されている fdarray のメンバーは無視され、再発明は戻り時に POLLNVAL に設定されます。 この動作は、固定 fdarray 割り当てを維持し、未使用のエントリを削除したりメモリを再割り当てしたりするために配列を圧縮しないアプリケーションに役立ちます。 WSAPoll を呼び出す前に、要素の再発明をクリアする必要はありません。

timeout 引数は、関数が返されるまでの待機時間を指定します。 正の値には、返されるまでに待機するミリ秒数が含まれます。 値が 0 の場合、 WSAPoll は直ちに戻り、負の値は WSAPoll が無期限に待機する必要があることを示します。

メモタイムアウト パラメーターが負の数に設定された WSAPoll などのブロッキング Winsock 呼び出しを発行する場合、Winsock は呼び出しを完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック Winsock 呼び出しを発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 
メモバージョン 2004 Windows 10時点で、TCP ソケットの接続に失敗したとき (POLLHUP \|POLLERR \|POLLWRNORM) が示されます。
 

Windows 8.1Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

要件

要件
サポートされている最小のクライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock2.h (Winsock2.h を含む)
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

WSAGetLastError

WSAPOLLFD