ProcessSocketNotifications 関数 (winsock2.h)

ソケットのセットを完了ポートに関連付け、そのポートで既に保留中のすべての通知を取得します。 関連付けられると、入力候補ポートは、指定されたソケット状態通知を受け取ります。 Microsoft Winsock プロバイダー ソケットのみがサポートされています。

システム呼び出しのオーバーヘッドを減らすために、通知に登録し、 ProcessSocketNotifications への 1 回の呼び出しでそれらを取得できます。 または、 GetQueuedCompletionStatus などの通常の I/O 入力候補ポート関数を呼び出すことによって、それらを明示的に取得することもできます。 ProcessSocketNotifications を使用して取得された通知は、GetQueuedCompletionStatusEx を使用して取得した通知と同じです。これには、ソケット状態の変更以外の通知パケットが含まれる場合があります。

通知イベント フラグは、返されるOVERLAPPED_ENTRY構造体の dwNumberOfBytesTransferred フィールドの整数値です。 これは 、JOBOBJECT_ASSOCIATE_COMPLETION_PORTの使用に似ています。また、 dwNumberOfBytesTransferred フィールドを使用して整数メッセージを送信します。 SocketNotificationRetrieveEvents 関数を呼び出して取得します。

ソケット ハンドルは、一度に 1 つの IOCP にのみ登録できます。 以前に登録したソケット ハンドルを再登録すると、既存の登録が上書きされます。 登録に使用するハンドルを閉じる前に、登録を明示的に削除し、 SOCK_NOTIFY_EVENT_REMOVE 通知を待つ必要があります (このトピックの 「備考 」を参照してください)。

詳細とコード例については、「 Winsock ソケットの状態通知」を参照してください。

構文

DWORD WSAAPI ProcessSocketNotifications(
  HANDLE                   completionPort,
  UINT32                   registrationCount,
  SOCK_NOTIFY_REGISTRATION *registrationInfos,
  UINT32                   timeoutMs,
  ULONG                    completionCount,
  OVERLAPPED_ENTRY         *completionPortEntries,
  UINT32                   *receivedEntryCount
);

パラメーター

completionPort

型: _In_ HANDLE

CreateIoCompletionPort 関数を使用して作成された I/O 入力候補ポートへのハンドル。 このポートは、ソケットに代わってメッセージが送信されるときに、PostQueuedCompletionStatus 関数の CompletionPort パラメーターで使用されます。

registrationCount

型: _In_ UINT32

registrationInfos によって提供される登録の数。

registrationInfos

種類: _Inout_updates_opt_(registrationCount) SOCK_NOTIFY_REGISTRATION*

通知登録パラメーターを定義 するSOCK_NOTIFY_REGISTRATION 構造体の配列へのポインター。 これには、対象のソケット、目的の通知イベント、および操作フラグが含まれます。 成功した場合は、登録が正常に処理されたかどうかを要素で調べる必要があります。 registrationCount が 0 の場合、この引数は NULL である必要があります。

timeoutMs

型: _In_ UINT32

完了ポートに完了パケットが表示されるまで待機する時間 (ミリ秒単位)。 指定した時間内に完了パケットが表示されない場合、関数はタイムアウトし、 ERROR_TIMEOUTを返します。

timeoutMs がINFINITE (0xFFFFFFFF) の場合、関数はタイムアウトしません。timeoutMs が 0 で、デキューする I/O 操作がない場合、関数はすぐにタイムアウトします。

completionCount が 0 の場合、timeoutMs の値は 0 である必要があります。

completionCount

型: _In_ ULONG

削除 するOVERLAPPED_ENTRY 構造体の最大数。 0 を指定すると、登録操作のみが処理されます。

completionPortEntries

種類: _Out_writes_to_opt_(completionCount, *receivedEntryCount) OVERLAPPED_ENTRY*

入力時に、OVERLAPPED_ENTRY 構造体の事前割り当て済み配列を指します。 配列は registrationInfos 配列と重複してはなりません。 completionCount が 0 の場合、completionPortEntries の値は NULL である必要があります。

出力時に、エントリを保持する OVERLAPPED_ENTRY 構造体の配列を受け取ります。 配列要素の数は ReceivedEntryCount によって提供されます。 構造体の dwNumberOfBytesTransferred フィールドは、受信したイベントの整数マスクです。 lpOverlapped フィールドは予約済みであり、ポインターとして使用することはできません。

receivedEntryCount

型: UINT32 _Out_opt_*

削除されたエントリの数を受け取る変数へのポインター。 completionCount が 0 の場合は NULL にする必要があります。

戻り値

成功した場合は、 ERROR_SUCCESSを返します。 関数が成功し、0 以外の completionCount を指定したが、指定した時間内に完了パケットが表示されない場合は、 WAIT_TIMEOUTが返されます。 それ以外の場合は、適切な WSAE* エラー コードを返します。

ERROR_SUCCESSまたはWAIT_TIMEOUTが返された場合は、個々の登録情報の登録結果を調べる必要があります。 それ以外の場合は、操作全体が失敗し、変更は発生しませんでした。

解説

通知を受信したときに可能なイベントについては、「 SocketNotificationRetrieveEvents 」を参照してください。

要件

   
サポートされている最小のクライアント Windows 10 ビルド 20348
サポートされている最小のサーバー Windows 10 ビルド 20348
Header winsock2.h
Library Ws2_32.lib
[DLL] Ws2_32.dll

関連項目