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 の値に関係なく、ソケット s を非ブロック モードに自動的に設定します。 ソケットをブロッキング モードに戻す方法については、 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 ソケット SPI クライアントのウィンドウ hWnd に送信します。 投稿されたメッセージの wParam 引数は、ネットワーク イベントが発生したソケットを識別します。 lParam のロー ワードは、発生したネットワーク イベントを指定します。 示される可能性のあるネットワーク イベント コードは次のとおりです。

意味
FD_READ ソケット 読み取り準備ができました
FD_WRITE ソケット s は書き込み準備ができています
FD_OOB 帯域外データはソケット読み取る準備ができています
FD_ACCEPT ソケット s は、新しい受信接続を受け入れる準備ができています
FD_CONNECT ソケット s で開始された接続が完了しました
FD_CLOSE ソケット s によって識別される接続が閉じられました
FD_QOS ソケット s に関連付けられているサービスの品質が変更されました
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
タイムアウトまたはその他のエラーが原因で接続が終了しました。

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

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

FD_CLOSE メッセージのエラー コードは、ソケットのクローズが正常か中止かを示します。 エラー コードが 0 の場合、close は正常でした。エラー コードが 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 メッセージは、ソケット s に関連付けられているフロー スペック内の任意のフィールドまたは s が属 するソケット グループにそれぞれ変更があった場合に投稿されます。 サービス プロバイダーは、 LPWSPIoctl 経由でクライアントが使用できる QOS 情報を、SIO_GET_QOSまたはSIO_GET_GROUP_QOSで更新する必要があります。

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

FD_ADDRESS_LIST_CHANGE メッセージは、LPWSPIoctl と SIO_ADDRESS_LIST_CHANGEのに 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. OOB データを受信できる場合は、 LPWSPRecv または LPWSPRecvFrom が 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
Header ws2spi.h

こちらもご覧ください

LPWSPAsyncSelect コールバック関数