次の方法で共有


LPWSPEVENTSELECT コールバック関数 (ws2spi.h)

LPWSPEventSelect 関数は、指定されたネットワーク イベントのセットに関連付けるイベント オブジェクトを指定します。

構文

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

パラメーター

[in] s

ソケットを識別する記述子。

[in] hEventObject

指定されたネットワーク イベントのセットに関連付けるイベント オブジェクトを識別するハンドル。

[in] lNetworkEvents

Windows ソケット SPI クライアントが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。 ビットごとの OR 演算子とこれらの値のいずれかを使用して構築されます。

価値 意味
FD_READ
読み取り準備の通知を発行します。
FD_WRITE
書き込み準備の通知を発行します。
FD_OOB
OOB データの到着通知を発行します。
FD_ACCEPT
受信接続の通知を発行します。
FD_CONNECT
完了した接続の通知を発行します。
FD_CLOSE
ソケットクロージャの通知を発行します。
FD_QOS
ソケット (QoS) の変更の通知を発行します。
FD_GROUP_QOS
引っ込み思案。
FD_ROUTING_INTERFACE_CHANGE
指定した宛先のルーティング インターフェイス変更の通知を発行します。
FD_ADDRESS_LIST_CHANGE
ソケットのアドレス ファミリのローカル アドレス一覧の変更の通知を発行します。

[out] lpErrno

エラー コードへのポインター。 詳細については、「戻り値」セクションを参照してください。

戻り値

Windows ソケット SPI クライアントによるネットワーク イベントの指定と、関連付けられているイベント オブジェクトが成功した場合、戻り値は 0 です。 それ以外の場合は、SOCKET_ERROR 値が返され、lpErrnoで特定のエラー番号 使用できます。

エラー コード 意味
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEINVAL の
指定したパラメーターのいずれかが無効であったか、指定したソケットが無効な状態であることを示します。
WSAEINPROGRESS を する
Windows ソケット呼び出しのブロックが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAENOTSOCK の
記述子はソケットではありません。

備考

この関数は、選択したネットワーク イベントに関連付けるイベント オブジェクト (hEventObject、 lNetworkEvents指定するために使用されます。 イベント オブジェクトが指定されているソケットは、によって識別されます。 イベント オブジェクトは、指定されたネットワーク イベントのいずれかが発生したときに設定されます。

LPWSPEventSelect LPWSPAsyncSelectと非常によく似ています。これは、指定されたネットワーク イベントが発生したときに実行されるアクションの違いです。 WSPAsyncSelect 、Windows Sockets SPI クライアント指定の Windows メッセージがポストされますが、LPWSPEventSelect 関連付けられているイベント オブジェクトを設定し、内部ネットワーク イベント レコードにこのイベントの発生を記録。 Windows ソケット SPI クライアントは、LPWSPEnumNetworkEvents を使用して内部ネットワーク イベント レコードの内容を取得し、指定されたネットワーク イベントのうちどれが発生したかを判断できます。

LPWSPEventSelect は、ネットワーク アクティビティとエラーを記録し、LPWSPEnumNetworkEvents使用して取得できるようにする唯一の関数です。 LPWSPSelect と LPWSPAsyncSelect の説明を参照して、これらの関数がネットワーク アクティビティとエラーを報告する方法を確認します。

この関数は、lNetworkEventsの値に関係なく、ソケット を非ブロッキング モード 自動的に設定します。

ソケットに LPWSPEventSelect を発行すると、同じソケットの LPWSPAsyncSelect または LPWSPEventSelect が取り消され、内部ネットワーク イベント レコードがクリアされます。 たとえば、ネットワーク イベントの読み取りと書き込みの両方にイベント オブジェクトを関連付けるには、Windows ソケット SPI クライアントは、次のように、FD_READとFD_WRITEの両方 LPWSPEventSelect を呼び出す必要があります。

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

ネットワーク イベントごとに異なるイベント オブジェクトを指定することはできません。 次のコードは機能しません。2 番目の呼び出しは最初の呼び出しの影響を取り消し、唯一の関連付けは hEventObject2 に関連付けられたFD_WRITEネットワーク イベントになります。

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

ソケット上のネットワーク イベントの関連付けと選択を取り消すには、lNetworkEvents を 0 に設定する必要があります。この場合、hEventObject パラメーターは無視されます。

rc = WSPEventSelect(s, hEventObject, 0);

LPWSPCloseSocket を使用してソケットを閉じると、ソケットの LPWSPEventSelect で指定されたネットワーク イベント 関連付けと選択も取り消されます。 ただし、Windows Sockets SPI クライアントは、WSACloseEvent 呼び出してイベント オブジェクトを明示的に閉じ、リソースを解放する必要があります。

LPWSPAccept'ed ソケットは、それを受け入れるために使用されるリッスン ソケットと同じプロパティを持っているため、リッスンソケットに設定された LPWSPEventSelect 関連付けとネットワーク イベントの選択は、受け入れられたソケットに適用されます。 たとえば、リッスン ソケットが、FD_ACCEPT、FD_READ、およびFD_WRITE hEventObject の関連付けを LPWSPEventSelect している場合、そのリッスン ソケットで受け入れられるソケットには、同じ hEventObjectに関連付けられたFD_ACCEPT、FD_READ、およびFD_WRITEネットワーク イベントも含まれます。 別の hEventObject またはネットワーク イベントが必要な場合、Windows ソケット SPI クライアントは LPWSPEventSelect呼び出し、受け入れられたソケットと必要な新しい情報を渡す必要があります。

ネットワーク イベントの発生を正常に記録し、関連付けられたイベント オブジェクトに通知した後、Windows Sockets SPI クライアントがそのネットワーク イベントの設定と関連付けられたイベント オブジェクトのシグナル通知を暗黙的に有効にする関数呼び出しを行うまで、そのネットワーク イベントに対してそれ以上のアクションは実行されません。

ネットワーク イベント 関数の再有効化
FD_READ LPWSPRecv または LPWSPRecvFrom
FD_WRITE LPWSPSend または LPWSPSendTo
FD_OOB LPWSPRecv または LPWSPRecvFrom
FD_ACCEPT LPWSPAccept、返されたエラー コードが条件関数から返されたことを示すWSATRY_AGAINでない限り、CF_DEFER
FD_CONNECT 何一つ
FD_CLOSE 何一つ
FD_QOS SIO_GET_QOSを使用して LPWSPIoctl を する
FD_GROUP_QOS ソケット グループでの将来の使用のために予約済み: SIO_GET_GROUP_QOSを使用した LPWSPIoctl
FD_ROUTING_INTERFACE_CHANGE コマンド SIO_ROUTING_INTERFACE_CHANGEを使用して LPWSPIoctl を する
FD_ADDRESS_LIST_CHANGE コマンド SIO_ADDRESS_LIST_CHANGEを使用して LPWSPIoctl を する

再有効化ルーチン (失敗したルーチンも含む) を呼び出すと、関連するネットワーク イベントとイベント オブジェクトの記録とシグナル通知が再度有効になります。

FD_READ、FD_OOB、およびFD_ACCEPTネットワーク イベントの場合、ネットワーク イベントの記録とイベント オブジェクトのシグナル通知は、レベルによってトリガーされる。 つまり、再有効化ルーチンが呼び出され、関連するネットワーク条件が呼び出し後も有効な場合は、ネットワーク イベントが記録され、関連付けられているイベント オブジェクトが通知されます。 これにより、Windows ソケット SPI クライアントをイベントドリブンにしながら、一度に到着するデータの量を気にしないようにすることができます。 次のシーケンスについて考えてみましょう。

  1. サービス プロバイダーは、ソケット で 100 バイトのデータを受信し、FD_READネットワーク イベントを記録し、関連付けられているイベント オブジェクトに通知します。
  2. Windows ソケット SPI クライアントは、50 バイトの読み取り WSPRecv(s, buffptr, 50, 0) を発行します。
  3. サービス プロバイダーは、FD_READネットワーク イベントを記録し、読み取るデータが残っているため、関連付けられているイベント オブジェクトに再度通知します。

これらのセマンティクスでは、Windows ソケット SPI クライアントは、FD_READネットワーク イベントに応答して使用可能なすべてのデータを読み取る必要はありません。 代わりに、各FD_READネットワーク イベントに応答する 1 つの LPWSPRecv が適切です。

FD_QOSイベントとFD_GROUP_QOS イベントは、エッジ によってトリガーされる見なされます。 サービス品質 (QOS) の変更が発生すると、メッセージは 1 回だけ投稿されます。 サービス プロバイダーが QOS のさらなる変更を検出するか、Windows ソケット SPI クライアントがソケットの QOS を再ネゴシエーションするまで、それ以上の兆候は発行されません。

FD_ROUTING_INTERFACE_CHANGEイベントとFD_ADDRESS_LIST_CHANGE イベントは、エッジによってトリガーされる 考慮されます。 Windows Sockets SPI クライアントが通知を要求 後に、SIO_ROUTING_INTERFACE_CHANGEまたはSIO_ADDRESS_LIST_CHANGEに対応して WSAIoctl 発行した後、変更が されたときに、メッセージが 1 回だけ投稿されます。 Windows ソケット SPI クライアントが IOCTL を再発行し、IOCTL の発行後に別の変更 検出されるまで、メッセージは今後は表示されません。

Windows ソケット SPI クライアントが LPWSPEventSelect呼び出すとき、または再有効化関数が呼び出されたときにネットワーク イベントが既に発生している場合は、ネットワーク イベントが記録され、関連するイベント オブジェクトが必要に応じて通知されます。 たとえば、次のシーケンスを考えてみましょう。

  1. Windows ソケット SPI クライアントは、LPWSPListen呼び出します。
  2. 接続要求は受信されますが、まだ受け入れられません。
  3. Windows ソケット SPI クライアントは、LPWSPEventSelect を呼び出、ソケットのFD_ACCEPT ネットワーク イベントに関心があることを指定します。 サービス プロバイダーは、FD_ACCEPTネットワーク イベントを記録し、関連付けられているイベント オブジェクトを直ちに通知します。

FD_WRITE ネットワーク イベントは、若干異なる方法で処理されます。 FD_WRITE ネットワーク イベントは、ソケットが最初に LPWSPConnect 接続されたとき、または LPWSPAccept受け入れられた後、LPWSPSend または LPWSPSendTo が WSAEWOULDBLOCK で失敗し、バッファー領域が使用可能になったときに記録されます。 したがって、Windows ソケット SPI クライアントは、最初の FD_WRITE ネットワーク イベント設定から送信が可能であり、送信が WSAEWOULDBLOCK を返すまで持続すると想定できます。 このようなエラーが発生した後、Windows ソケット SPI クライアントは、FD_WRITEネットワーク イベントが記録され、関連付けられているイベント オブジェクトが通知されたときに、送信が再び可能であることを検出します。

FD_OOB ネットワーク イベントは、帯域外データを個別に受信するようにソケットが構成されている場合にのみ使用されます。 ソケットが帯域外データをインラインで受信するように構成されている場合、帯域外 (優先) データは通常のデータとして扱われ、Windows Sockets SPI クライアントはネットワーク イベント FD_OOBではなく、ネットワーク イベントFD_READ関心を登録し、取得FD_READ必要があります。 Windows ソケット SPI クライアントは、SO_OOBINLINE オプションに対して LPWSPSetSockOpt または LPWSPGetSockOpt 使用して、帯域外データの処理方法を設定または検査できます。

FD_CLOSE ネットワーク イベントのエラー コードは、ソケットの閉じ方が正常か中止かを示します。 エラー コードが 0 の場合、閉じは正常でした。エラー コードが WSAECONNRESET の場合、ソケットの仮想回線がリセットされました。 これは、SOCK_STREAMなどの接続指向ソケットにのみ適用されます。

FD_CLOSE ネットワーク イベントは、ソケットに対応する仮想回線に対してクローズ表示が受信されたときに記録されます。 TCP では、これは、接続が FIN WAIT または CLOSE WAIT 状態になったときにFD_CLOSEが記録されることを意味します。 これは、リモート 側で送信側で LPWSPShutdown を実行するか、lpWSPCloseSocketを実行した結果です。

サービス プロバイダーは、仮想回線のクローズを示すために、FD_CLOSE ネットワーク イベント のみを記録する必要があります。FD_READネットワーク イベントを記録、その状態を示す必要があります。

FD_QOSまたはFD_GROUP_QOSのネットワーク イベントは、ソケット に関連付けられたフロー スペック内の任意のフィールド、または が属するソケット グループ 変更された場合に記録されます。 この変更は、LPWSPIoctl 関数を使用して、ソケット または が属するソケット グループの現在の QOS を取得するために、SIO_GET_QOSまたはSIO_GET_GROUP_QOSを使用して Windows ソケット SPI クライアント 使用できるようにする必要があります。

FD_ROUTING_INTERFACE_CHANGE ネットワーク イベントは、このような IOCTL が発行された後に、WSAIoctl で指定された宛先 SIO_ROUTING_INTERFACE_CHANGE変更 に到達するために使用するローカル インターフェイス 記録されます。

FD_ADDRESS_LIST_CHANGE ネットワーク イベントは、SIO_ADDRESS_LIST_CHANGEを使用して WSAIoctl をした後、Windows Sockets SPI クライアントが変更 バインドできるソケットのプロトコル ファミリのアドレスの一覧が記録されます。

必要条件

要件 価値
サポートされる最小クライアント Windows 10 ビルド 20348
サポートされる最小サーバー Windows 10 ビルド 20348
ヘッダー ws2spi.h

関連項目

LPWSPEnumNetworkEvents の