LPWSPASYNCSELECT コールバック関数 (ws2spi.h)
LPWSPAsyncSelect 関数は、ソケットのネットワーク イベントの Windows メッセージ ベースのイベント通知を要求します。
構文
LPWSPASYNCSELECT Lpwspasyncselect;
int Lpwspasyncselect(
[in] SOCKET s,
[in] HWND hWnd,
[in] unsigned int wMsg,
[in] long lEvent,
[out] LPINT lpErrno
)
{...}
パラメーター
[in] s
イベント通知が必要なソケットを識別する記述子。
[in] hWnd
ネットワーク イベントが発生したときにメッセージを受信するウィンドウの識別を処理します。
[in] wMsg
ネットワーク イベントが発生したときに送信されるメッセージ。
[in] lEvent
Windows ソケット サービス プロバイダー インターフェイス (SPI) クライアントが関心を持つネットワーク イベントの組み合わせを指定するビットマスク。 ビットごとの OR 演算子とこれらの値のいずれかを使用して構築されます。
価値 | 意味 |
---|---|
|
読み取り準備の通知を発行します。 |
|
書き込み準備の通知を発行します。 |
|
OOB データの到着通知を発行します。 |
|
受信接続の通知を発行します。 |
|
完了した接続の通知を発行します。 |
|
ソケットクロージャの通知を発行します。 |
|
ソケットのサービス品質 (QoS) の変更の通知を発行します。 |
|
引っ込み思案。 |
|
指定した宛先のルーティング インターフェイス変更の通知を発行します。 |
|
ソケットのプロトコル ファミリのローカル アドレス一覧の変更の通知を発行します。 |
[out] lpErrno
エラー コードへのポインター。 詳細については、「戻り値」セクションを参照してください。
戻り値
ネットワーク イベント セットに対する Windows ソケット SPI クライアントの関心の宣言が成功した場合、戻り値は 0 です。 それ以外の場合は、SOCKET_ERROR値が返され、lpErrnoで特定のエラー コード
エラー コード | 意味 |
---|---|
|
ネットワーク サブシステムが失敗しました。 |
|
既存のウィンドウを参照していないウィンドウ ハンドルや、指定したソケットが無効な状態など、指定されたパラメーターのいずれかが無効であることを示します。 |
|
ブロックしている Windows ソケット呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 |
|
記述子はソケットではありません。 |
アプリケーション ウィンドウでメッセージを受信したときに設定できる追加のエラー コードについては、「
備考
この関数は、サービス プロバイダーが
この関数は、
ソケット
rc = WSPAsyncSelect(s, hWnd, wMsg, FD_READ | FD_WRITE, &error);
イベントごとに異なるメッセージを指定することはできません。 次のコードは機能しません。2 番目の呼び出しは最初の呼び出しの効果を取り消し、唯一の関連付けは wMsg2 に関連付けられたFD_WRITEイベントになります。
// Incorrect example.
rc = WSPAsyncSelect(s, hWnd, wMsg1, FD_READ, &error);
rc = WSPAsyncSelect(s, hWnd, wMsg2, FD_WRITE, &error);
すべての通知を取り消すには (つまり、サービス プロバイダーがソケット上のネットワーク イベントに関連するメッセージをそれ以上送信してはならないことを示すために)、lEvent を 0 に設定します。
rc = WSPAsyncSelect(s, hWnd, 0, 0, &error);
LPWSPAccept'ed ソケットは、それを受け入れるために使用されるリッスン ソケットと同じプロパティを持っているため、リッスン ソケットに設定されたすべての LPWSPAsyncSelect イベントは、受け入れられたソケットに適用されます。 たとえば、リッスン しているソケットに LPWSPAsyncSelect イベントFD_ACCEPT、FD_READ、およびFD_WRITEが
指定されたソケット
価値 | 意味 |
---|---|
FD_READ | ソケット の を読み取る準備ができました |
FD_WRITE | ソケット の を書き込む準備ができました |
FD_OOB | 帯域外データは、ソケット の で読み取る準備ができています |
FD_ACCEPT | ソケット は、新しい受信接続を受け入れる準備ができています |
FD_CONNECT | ソケット s で開始された接続が完了しました |
FD_CLOSE | ソケット s によって識別される接続が閉じられました |
FD_QOS | ソケット に関連付けられているサービスの品質が変更されました |
FD_GROUP_QOS | ソケット グループで将来使用するために予約済み: ソケット が属するソケット グループに関連付けられているサービス品質が変更されました |
FD_ROUTING_INTERFACE_CHANGE | 指定した宛先への送信に使用するローカル インターフェイスが変更されました |
FD_ADDRESS_LIST_CHANGE | Windows ソケット SPI クライアントがバインドできるソケットのプロトコル ファミリのアドレスの一覧が変更されました |
lParam の上位ワードには、エラー コードが含まれています (WSAGETSELECTERROR マクロを使用して抽出できます)。 エラー コードは、ws2spi.h
で定義されているエラーです。 ネットワーク イベントごとに考えられるエラー コードを次の表に示します。
イベント: FD_CONNECT
エラー コード | 意味 |
---|---|
|
指定されたファミリ内のアドレスは、このソケットでは使用できません。 |
|
接続の試行が拒否されました。 |
|
現時点では、このホストからネットワークにアクセスできません。 |
|
namelen パラメーターが無効です。 |
|
ソケットは既にアドレスにバインドされています。 |
ソケットは既に接続されています。 | |
|
これ以上ファイル記述子を使用できません。 |
|
使用できるバッファー領域はありません。 ソケットを接続できません。 |
|
ソケットが接続されていません。 |
|
接続を確立せずに、タイムアウトした接続を試みます。 |
イベント: FD_CLOSE
エラー コード | 意味 |
---|---|
|
ネットワーク サブシステムが失敗しました。 |
|
リモート側で接続がリセットされました。 |
|
タイムアウトまたはその他のエラーが原因で接続が終了しました。 |
イベント...: FD_ACCEPT、FD_ADDRESS_LIST_CHANGE、FD_GROUP_QOS、FD_OOB、FD_QOS、FD_READ、FD_WRITE
エラー コード | 意味 |
---|---|
|
ネットワーク サブシステムが失敗しました。 |
イベント: FD_ROUTING_INTERFACE_CHANGE
エラー コード | 意味 |
---|---|
|
指定された宛先に到達できなくなりました。 |
|
ネットワーク サブシステムが失敗しました。 |
LPWSPAsyncSelect は複数のイベントに関心を持って呼び出すことができますが、サービス プロバイダーはイベントごとに同じ Windows メッセージを発行します。
Windows Sockets 2 プロバイダーは、特定のネットワーク イベントのメッセージを Windows ソケット SPI クライアントに継続的にフラッディングしないようにする必要があります。 特定のイベントの通知が Windows ソケット SPI クライアント ウィンドウに正常に送信された場合、Windows Sockets SPI クライアントがそのネットワーク イベントの通知を暗黙的に再有効化する関数呼び出しを行うまで、そのネットワーク イベントのそれ以上のメッセージは Windows Sockets SPI クライアント ウィンドウにポストされません。
ネットワーク イベント | 関数の再有効化 |
---|---|
FD_READ | LPWSPRecv または LPWSPRecvFrom |
FD_WRITE | LPWSPSend または LPWSPSendTo |
FD_OOB | LPWSPRecv または LPWSPRecvFrom |
FD_ACCEPT | LPWSPAccept |
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イベントの場合、メッセージポストはレベルによってトリガーされる
FD_QOSイベントとFD_GROUP_QOS イベントは、エッジ によってトリガーされる
FD_ROUTING_INTERFACE_CHANGEイベントとFD_ADDRESS_LIST_CHANGE イベントは、エッジによってトリガーされる
Windows ソケット SPI クライアントが LPWSPAsyncSelect
- Windows ソケット SPI クライアントは、LPWSPListen
呼び出します。 - 接続要求は受信されますが、まだ受け入れられません。
- Windows ソケット SPI クライアントは、LPWSPAsyncSelect を呼び出、ソケットのFD_ACCEPTメッセージを受信することを指定します。 イベントの永続化により、WinSock サービス プロバイダーはFD_ACCEPT メッセージを直ちに投稿します。
FD_WRITE イベントの処理方法は若干異なります。 FD_WRITEメッセージは、ソケットが最初に LPWSPConnect
FD_OOB イベントは、帯域外データを個別に受信するようにソケットが構成されている場合にのみ使用されます。 ソケットが帯域外データをインラインで受信するように構成されている場合、帯域外 (優先) データは通常のデータとして扱われ、Windows Sockets SPI クライアントはイベントではなく、FD_READ イベントに関心 FD_OOBを登録する必要があります。
FD_CLOSE メッセージのエラー コードは、ソケットのクローズが正常か中止かを示します。 エラー コードが 0 の場合、閉じは正常でした。エラー コードが WSAECONNRESET の場合、ソケットの仮想回線がリセットされました。 これは、SOCK_STREAMなどの接続指向ソケットにのみ適用されます。
FD_CLOSE メッセージは、ソケットに対応する仮想回線に対してクローズ表示が受信されたときにポストされます。 TCP の用語では、接続が TIME WAIT または CLOSE WAIT 状態になると、FD_CLOSEがポストされることを意味します。 これは、リモート エンドが送信側で
グレースフル クローズの場合、サービス プロバイダーは、受信したすべてのデータが読み取られた後にのみ、仮想回線の終了を示すFD_CLOSE メッセージを送信する必要があります。 この条件を示すFD_READ メッセージを送信しないでください。
FD_QOSまたはFD_GROUP_QOSメッセージは、ソケット
FD_ROUTING_INTERFACE_CHANGE メッセージは、このような IOCTL が発行された後に、SIO_ROUTING_INTERFACE_CHANGE変更が LPWSPIoctl で指定された宛先に到達するために使用するローカル インターフェイス 発行されたときにポストされます。
FD_ADDRESS_LIST_CHANGE メッセージは、SIO_ADDRESS_LIST_CHANGEで LPWSPIoctl
各非同期通知メッセージのイベントと条件の概要を次に示します。
FD_READ
- LPWSPAsyncSelect が呼び出されたときに、現在受信できるデータがある場合。
- データが到着したとき (まだ転記されていない場合FD_READ)。
- LPWSPRecv
した後、または LPWSPRecvFrom が呼び出 (MSG_PEEKあり、または使用しない場合)、データを受信できる場合。
LPWSPSetSockOpt SO_OOBINLINE
FD_WRITE
- LPWSPAsyncSelect
呼び出されると、LPWSPSend または LPWSPSendTo 可能な場合。 - 接続が確立されると、LPWSPConnect または
LPWSPAccept が呼び出後。 - LPWSPSend
した後、または LPWSPSendTo WSAEWOULDBLOCK で失敗 、LPWSPSend または LPWSPSendToが成功する可能性があります。 - コネクションレス ソケットで LPWSPBind を
した後。 FD_WRITEは、現時点で発生する場合と発生しない場合があります (実装に依存)。 いずれの場合も、コネクションレス ソケットは、LPWSPBind した直後に常に書き込み可能です。
- LPWSPAsyncSelect
呼び出されると、現在、MSG_OOB フラグで受信できる OOB データがある場合。 - OOB データが到着したとき (まだ転記されていない場合FD_OOB)。
- LPWSPRecv を
した後、または LPWSPRecvFrom 、OOB データを受信できる場合は、MSG_OOB フラグの有無にかかわらず呼び出されます。
FD_ACCEPT
- LPWSPAsyncSelect が呼び出されたときに、現在、受け入れ可能な接続要求がある場合。
- 接続要求が到着したとき (まだ投稿されていない場合FD_ACCEPT)。
- LPWSPAccept
呼び出された後、別の接続要求を受け入れる必要がある場合。
FD_CONNECT
- LPWSPAsyncSelect
呼び出されたとき (現在接続が確立されている場合)。 - LPWSPConnect
呼び出された後、接続が確立されたとき (データグラム ソケットの場合と同様に、 LPWSPConnect が直ちに成功した場合でも)、すぐに失敗した場合も同様です。 - WSPJoinLeaf
呼び出された後、結合操作が完了したとき。 接続 後、WSAConnectをするか、非ブロッキングの接続指向ソケットを使用して WSPJoinLeaf を呼び出 。 WSAEWOULDBLOCK の特定のエラーで最初の操作が返されましたが、ネットワーク操作は先に進みました。 操作が最終的に成功したかどうかに関係なく、結果が決定されると、FD_CONNECTが発生します。 クライアントは、エラー コードを確認して、結果が成功または失敗であったかどうかを判断する必要があります。
FD_CLOSE (接続指向ソケット (SOCK_STREAM など) でのみ有効)
- LPWSPAsyncSelect が呼び出されたとき (ソケット接続が閉じられている場合)。
- リモート システムがグレースフル クローズを開始した後、現在データを受信できない場合 (リモート システムが正常終了を開始したときにデータが受信され、読み取りを待機している場合は、保留中のすべてのデータが読み取られるまで、FD_CLOSEは配信されません)。
- ローカル システムが LPWSPShutdown
でグレースフル クローズを開始した後、リモート システムは、現在受信できるデータがない場合に、 のデータ終了 通知 (TCP FIN など) で応答します。 - リモート システムが接続を中止すると (送信された TCP RST など)、lParam
には WSAECONNRESET エラー値が含まれます。
LPWSPCloseSocket
FD_QOS
- LPWSPAsyncSelect が呼び出されたときに、ソケットに関連付けられている QOS が変更された場合。
- SIO_GET_QOS LPWSPIoctl が呼び出された後、QOS が変更されたとき。
FD_GROUP_QOS
ソケット グループで将来使用するために予約されています。
- LPWSPAsyncSelect
呼び出されたときに、ソケットに関連付けられているグループ QOS が変更された場合。 - SIO_GET_GROUP_QOS LPWSPIoctl が呼び出された後、グループ QOS が変更されたとき。
FD_ROUTING_INTERFACE_CHANGE
- SIO_ROUTING_INTERFACE_CHANGE LPWSPIoctl が呼び出された後、IOCTL で指定された宛先に到達するために使用するローカル インターフェイスが変更されたとき。
FD_ADDRESS_LIST_CHANGE
- SIO_ADDRESS_LIST_CHANGE LPWSPIoctl が呼び出された後、Windows ソケット SPI クライアントがバインドできるローカル アドレスの一覧が変更されたとき。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 10 ビルド 20348 |
サポートされる最小サーバー | Windows 10 ビルド 20348 |
ヘッダー | ws2spi.h |
関連項目
LPWSPAsyncSelect コールバック関数 の