次の方法で共有


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 演算子とこれらの値のいずれかを使用して構築されます。

価値 意味
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 の
記述子はソケットではありません。

アプリケーション ウィンドウでメッセージを受信したときに設定できる追加のエラー コードについては、「解説」を参照してください (メッセージ内の lParam の概要)。

備考

この関数は、サービス プロバイダーが lEvent 引数で指定されたネットワーク イベントを検出するたびに、hWnd クライアントのウィンドウに Windows メッセージを送信するように要求するために使用されます。 サービス プロバイダーは、WPUPostMessage 関数を使用してメッセージを投稿する必要があります。 送信するメッセージは、wMsg パラメーターによって指定されます。 通知が必要なソケットは、によって識別されます。

この関数は、lEventの値に関係なく、ソケット を非ブロッキング モード 自動的に設定します。 ソケット ブロッキング モードに戻す方法については、LPWSPIoctl を参照してください。

ソケット LPWSPAsyncSelect を呼び出すと、以前の LPWSPAsyncSelect または同じソケットの LPWSPEventSelect が取り消されます。 たとえば、読み取りと書き込みの両方の通知を受け取るために、Windows ソケット SPI クライアントは、次のように、FD_READとFD_WRITEの両方 LPWSPAsyncSelect を呼び出す必要があります。

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が されている場合、そのリッスン ソケットで受け入れられるソケットには、メッセージに使用される同じ wMsg 値を持つFD_ACCEPT、FD_READ、およびFD_WRITEイベントも含まれます。 別の wMsg またはイベントが必要な場合、Windows ソケット SPI クライアントは、LPWSPAsyncSelect呼び出し、受け入れられたソケット、および必要な新しい情報を渡す必要があります。

指定されたソケット で、指定されたネットワーク イベントのいずれかが発生すると、サービス プロバイダーは WPUPostMessage を使用して、wMsg メッセージを Windows Sockets SPI クライアントのウィンドウ hWndに送信します。 投稿されたメッセージでは、wParam 引数は、ネットワーク イベントが発生したソケットを識別します。 lParam の下位ワード 、発生したネットワーク イベントを指定します。 表示される可能性のあるネットワーク イベント コードは次のとおりです。

価値 意味
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

エラー コード 意味
WSAEAFNOSUPPORT の
指定されたファミリ内のアドレスは、このソケットでは使用できません。
WSAECONNREFUSED の
接続の試行が拒否されました。
WSAENETUNREACH を する
現時点では、このホストからネットワークにアクセスできません。
WSAEFAULT を する
namelen パラメーターが無効です。
WSAEINVAL の
ソケットは既にアドレスにバインドされています。
WSAEISCONN
ソケットは既に接続されています。
WSAEMFILE の
これ以上ファイル記述子を使用できません。
WSAENOBUFS の
使用できるバッファー領域はありません。 ソケットを接続できません。
WSAENOTCONN を する
ソケットが接続されていません。
WSAETIMEDOUT の
接続を確立せずに、タイムアウトした接続を試みます。

イベント: FD_CLOSE

エラー コード 意味
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAECONNRESET の
リモート側で接続がリセットされました。
WSAECONNABORTED の
タイムアウトまたはその他のエラーが原因で接続が終了しました。

イベント...: FD_ACCEPT、FD_ADDRESS_LIST_CHANGE、FD_GROUP_QOS、FD_OOB、FD_QOS、FD_READ、FD_WRITE

エラー コード 意味
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。

イベント: FD_ROUTING_INTERFACE_CHANGE

エラー コード 意味
WSAENETUNREACH を する
指定された宛先に到達できなくなりました。
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。

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、返されたエラー コードが条件関数から返されたことを示す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イベントの場合、メッセージポストはレベルによってトリガーされる。 つまり、再有効化ルーチンが呼び出され、呼び出し後も関連する条件が満たされた場合、LPWSPAsyncSelect メッセージが Windows ソケット SPI クライアントにポストされます。

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

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

Windows ソケット SPI クライアントが LPWSPAsyncSelect呼び出すとき、または再有効化関数が呼び出されたときに、イベントが既に発生している場合は、必要に応じてメッセージがポストされます。 たとえば、次のシーケンスを考えてみましょう。

  1. Windows ソケット SPI クライアントは、LPWSPListen呼び出します。
  2. 接続要求は受信されますが、まだ受け入れられません。
  3. Windows ソケット SPI クライアントは、LPWSPAsyncSelect を呼び出、ソケットのFD_ACCEPTメッセージを受信することを指定します。 イベントの永続化により、WinSock サービス プロバイダーはFD_ACCEPT メッセージを直ちに投稿します。

FD_WRITE イベントの処理方法は若干異なります。 FD_WRITEメッセージは、ソケットが最初に LPWSPConnect 接続されたとき (FD_CONNECT後に登録された場合)、または LPWSPAccept受け入れられた後、LPWSPSend または LPWSPSendTo が WSAEWOULDBLOCK で失敗し、バッファー領域が使用可能になったときにポストされます。 したがって、Windows ソケット SPI クライアントは、最初のFD_WRITE メッセージから送信が WSAEWOULDBLOCK を返すまで送信が可能であると想定できます。 このようなエラーが発生すると、Windows ソケット SPI クライアントに、FD_WRITE メッセージを使用して再び送信が可能であることが通知されます。

FD_OOB イベントは、帯域外データを個別に受信するようにソケットが構成されている場合にのみ使用されます。 ソケットが帯域外データをインラインで受信するように構成されている場合、帯域外 (優先) データは通常のデータとして扱われ、Windows Sockets SPI クライアントはイベントではなく、FD_READ イベントに関心 FD_OOBを登録する必要があります。

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

FD_CLOSE メッセージは、ソケットに対応する仮想回線に対してクローズ表示が受信されたときにポストされます。 TCP の用語では、接続が TIME WAIT または CLOSE WAIT 状態になると、FD_CLOSEがポストされることを意味します。 これは、リモート エンドが送信側で LPWSPShutdown を実行するか、LPWSPCloseSocket実行した結果です。 すべてのデータがソケットから読み取られた後にのみ、FD_CLOSEが投稿されるのは正しいことです。

グレースフル クローズの場合、サービス プロバイダーは、受信したすべてのデータが読み取られた後にのみ、仮想回線の終了を示すFD_CLOSE メッセージを送信する必要があります。 この条件を示すFD_READ メッセージを送信しないでください。

FD_QOSまたはFD_GROUP_QOSメッセージは、ソケット に関連付けられているフロー スペック内の任意のフィールド、または が属するソケット グループにそれぞれ変更があった場合に投稿されます。 サービス プロバイダーは、SIO_GET_QOSやSIO_GET_GROUP_QOSを使用して、LPWSPIoctl 使用できる QOS 情報を更新する必要があります。

FD_ROUTING_INTERFACE_CHANGE メッセージは、このような IOCTL が発行された後に、SIO_ROUTING_INTERFACE_CHANGE変更が LPWSPIoctl で指定された宛先に到達するために使用するローカル インターフェイス 発行されたときにポストされます。

FD_ADDRESS_LIST_CHANGE メッセージは、SIO_ADDRESS_LIST_CHANGEで LPWSPIoctlした後に、Windows ソケット SPI クライアントが変更 バインドできるアドレスの一覧が発行されたときに投稿されます。

各非同期通知メッセージのイベントと条件の概要を次に示します。

FD_READ

  1. LPWSPAsyncSelect が呼び出されたときに、現在受信できるデータがある場合。
  2. データが到着したとき (まだ転記されていない場合FD_READ)。
  3. LPWSPRecv した後、または LPWSPRecvFrom が呼び出 (MSG_PEEKあり、または使用しない場合)、データを受信できる場合。

LPWSPSetSockOpt SO_OOBINLINE 有効にすると、データ には、上記のインスタンスに通常のデータと帯域外 (OOB) データの両方が含まれます。

FD_WRITE

  1. LPWSPAsyncSelect 呼び出されると、LPWSPSend または LPWSPSendTo 可能な場合。
  2. 接続が確立されると、LPWSPConnect または LPWSPAccept が呼び出 後。
  3. LPWSPSend した後、または LPWSPSendTo WSAEWOULDBLOCK で失敗 、LPWSPSend または LPWSPSendTo が成功する可能性があります。
  4. コネクションレス ソケットで LPWSPBind を した後。 FD_WRITEは、現時点で発生する場合と発生しない場合があります (実装に依存)。 いずれの場合も、コネクションレス ソケットは、LPWSPBindした直後に常に書き込み可能です。

FD_OOB (LPWSPSetSockOpt SO_OOBINLINE 無効になっている場合にのみ有効です (既定値)

  1. LPWSPAsyncSelect 呼び出されると、現在、MSG_OOB フラグで受信できる OOB データがある場合。
  2. OOB データが到着したとき (まだ転記されていない場合FD_OOB)。
  3. LPWSPRecv を した後、または LPWSPRecvFrom 、OOB データを受信できる場合は、MSG_OOB フラグの有無にかかわらず呼び出されます。

FD_ACCEPT

  1. LPWSPAsyncSelect が呼び出されたときに、現在、受け入れ可能な接続要求がある場合。
  2. 接続要求が到着したとき (まだ投稿されていない場合FD_ACCEPT)。
  3. LPWSPAccept 呼び出された後、別の接続要求を受け入れる必要がある場合。

FD_CONNECT

  1. LPWSPAsyncSelect 呼び出されたとき (現在接続が確立されている場合)。
  2. LPWSPConnect 呼び出された後、接続が確立されたとき (データグラム ソケットの場合と同様に、LPWSPConnect が直ちに成功した場合でも)、すぐに失敗した場合も同様です。
  3. WSPJoinLeaf 呼び出された後、結合操作が完了したとき。
  4. 接続後、WSAConnectを するか、非ブロッキングの接続指向ソケットを使用して WSPJoinLeaf を呼び出 。 WSAEWOULDBLOCK の特定のエラーで最初の操作が返されましたが、ネットワーク操作は先に進みました。 操作が最終的に成功したかどうかに関係なく、結果が決定されると、FD_CONNECTが発生します。 クライアントは、エラー コードを確認して、結果が成功または失敗であったかどうかを判断する必要があります。

FD_CLOSE (接続指向ソケット (SOCK_STREAM など) でのみ有効)

  1. LPWSPAsyncSelect が呼び出されたとき (ソケット接続が閉じられている場合)。
  2. リモート システムがグレースフル クローズを開始した後、現在データを受信できない場合 (リモート システムが正常終了を開始したときにデータが受信され、読み取りを待機している場合は、保留中のすべてのデータが読み取られるまで、FD_CLOSEは配信されません)。
  3. ローカル システムが LPWSPShutdown でグレースフル クローズを開始した後、リモート システムは、現在受信できるデータがない場合に、のデータ終了 通知 (TCP FIN など) で応答します。
  4. リモート システムが接続を中止すると (送信された TCP RST など)、lParam には WSAECONNRESET エラー値が含まれます。

LPWSPCloseSocket 呼び出された後、FD_CLOSEはポストされません。

FD_QOS

  1. LPWSPAsyncSelect が呼び出されたときに、ソケットに関連付けられている QOS が変更された場合。
  2. SIO_GET_QOS LPWSPIoctl が呼び出された後、QOS が変更されたとき。

FD_GROUP_QOS

ソケット グループで将来使用するために予約されています。

  1. LPWSPAsyncSelect 呼び出されたときに、ソケットに関連付けられているグループ QOS が変更された場合。
  2. SIO_GET_GROUP_QOS LPWSPIoctl が呼び出された後、グループ QOS が変更されたとき。

FD_ROUTING_INTERFACE_CHANGE

  1. SIO_ROUTING_INTERFACE_CHANGE LPWSPIoctl が呼び出された後、IOCTL で指定された宛先に到達するために使用するローカル インターフェイスが変更されたとき。

FD_ADDRESS_LIST_CHANGE

  1. SIO_ADDRESS_LIST_CHANGE LPWSPIoctl が呼び出された後、Windows ソケット SPI クライアントがバインドできるローカル アドレスの一覧が変更されたとき。

必要条件

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

関連項目

LPWSPAsyncSelect コールバック関数 の