次の方法で共有


PFN_WSK_ACCEPT_EVENT コールバック関数 (wsk.h)

WskAcceptEvent イベント コールバック関数は、リッスン しているソケット上の受信接続が受け入れられたことを WSK アプリケーションに通知します。

構文

PFN_WSK_ACCEPT_EVENT PfnWskAcceptEvent;

NTSTATUS PfnWskAcceptEvent(
  [in, optional] PVOID SocketContext,
  [in]           ULONG Flags,
  [in]           PSOCKADDR LocalAddress,
  [in]           PSOCKADDR RemoteAddress,
  [in, optional] PWSK_SOCKET AcceptSocket,
  [out]          PVOID *AcceptSocketContext,
  [out]          const WSK_CLIENT_CONNECTION_DISPATCH **AcceptSocketDispatch
)
{...}

パラメーター

[in, optional] SocketContext

受信接続が受け入れられたリッスン ソケットのソケット コンテキストへのポインター。 WSK アプリケーションは、WskSocket 関数を呼び出してリッスン ソケットを作成するときに、このポインターを WSK サブシステムに提供しました。

[in] Flags

次のフラグまたはゼロを含む ULONG 値。

WSK_FLAG_AT_DISPATCH_LEVEL

WSK サブシステムは、IRQL = DISPATCH_LEVEL でイベント コールバック関数 WskAcceptEvent を呼び出しました。 このフラグが設定されていない場合、WSK サブシステムは、IRQL <= DISPATCH_LEVELでイベント コールバック関数 WskAcceptEvent を呼び出している可能性があります。

[in] LocalAddress

受信接続が到着したローカル トランスポート アドレスを格納しているバッファーへのポインター。 バッファーには、WSK アプリケーションがリッスン ソケットの作成時に指定したアドレス ファミリに対応する特定の SOCKADDR 構造体型が含まれています。

[in] RemoteAddress

受信接続の送信元のリモート トランスポート アドレスを含むバッファーへのポインター。 バッファーには、WSK アプリケーションがリッスン ソケットの作成時に指定したアドレス ファミリに対応する特定の SOCKADDR 構造体型が含まれています。

[in, optional] AcceptSocket

受け入れられたソケットのソケット オブジェクトである WSK_SOCKET 構造体へのポインター。 このポインターが NULL 場合、リッスン ソケットは機能しなくなり、WSK アプリケーションは WskCloseSocket 関数を呼び出して、できるだけ早くリッスン ソケットを閉じる必要があります。

[out] AcceptSocketContext

受け入れられているソケットの WSK アプリケーション提供のコンテキストへのポインターを受け取る変数へのポインター。 WSK サブシステムは、このポインターを受け入れたソケットのイベント コールバック関数に渡します。 コンテキスト情報は WSK サブシステムに対して不透明であり、非ページ メモリに格納する必要があります。 WSK アプリケーションが受け入れられたソケットでイベント コールバック関数を有効にしない場合、アプリケーションは、AcceptSocketContext パラメーターが指す変数を NULL 設定する必要があります。

[out] AcceptSocketDispatch

定数へのポインターを受け取る変数へのポインター WSK_CLIENT_CONNECTION_DISPATCH 構造体。 この構造体は、受け入れられたソケットのイベント コールバック関数へのポインターを含むディスパッチ テーブルです。 WSK アプリケーションが受け入れられたソケットのすべてのイベント コールバック関数を有効にしない場合、アプリケーションはディスパッチ テーブル内のポインターを、有効にしないイベント コールバック関数に対して NULL するように設定する必要があります。 WSK アプリケーションが受け入れられたソケットでイベント コールバック関数を有効にしない場合は、AcceptSocketDispatch パラメーターが指す変数を NULL 設定する必要があります。

戻り値

WSK アプリケーションの WskAcceptEvent イベント コールバック関数は、次のいずれかの NTSTATUS コードを返すことができます。

リターン コード 形容
STATUS_SUCCESS
WSK アプリケーションが受信接続を受け入れた。
STATUS_REQUEST_NOT_ACCEPTED
WSK アプリケーションが受信接続を拒否しました。 この値が返された場合、WSK サブシステムは WSK アプリケーションの代わりに受け入れられたソケットを閉じます。

備考

WSK サブシステムは、イベント コールバック関数が以前に SO_WSK_EVENT_CALLBACK ソケット オプションで有効になっていた場合にのみ、リッスン ソケットで受信接続が受け入れられると、WSK アプリケーションの WskAcceptEvent イベント コールバック関数を呼び出します。 ソケットのイベント コールバック関数の有効化の詳細については、「イベント コールバック関数の有効化と無効化」を参照してください。

WSK アプリケーションの WskAcceptEvent イベント コールバック関数がリッスン ソケットで有効になっていて、アプリケーションが同じリッスン ソケットで WskAccept 関数の保留中の呼び出しを行っている場合、受信接続が到着すると、WskAccept への保留中の呼び出WskAcceptEvent イベント コールバック関数よりも優先されます。 WSK サブシステムは、WskAccept 関数の保留中の呼び出しからキューに登録された IRP がない場合にのみ、アプリケーションの WskAcceptEvent イベント コールバック関数を呼び出します。 ただし、WSK アプリケーションでは、wskAccept 関数の 呼び出しが保留中のリッスン ソケットに対して、WSK サブシステムがアプリケーションの WskAcceptEvent イベント コールバック関数を呼び出さないと想定しないでください。 WSK サブシステムが WSK アプリケーションの WskAcceptEvent ソケットのイベント コールバック関数を呼び出すことができる競合状態が存在します。 WSK アプリケーションで、WSK サブシステムがリッスン ソケットに対してアプリケーションの WskAcceptEvent イベント コールバック関数を呼び出さない唯一の方法は、ソケットでアプリケーションの WskAcceptEvent イベント コールバック関数を無効にすることです。

WSK サブシステムが WSK アプリケーションの WskAcceptEvent イベント コールバック関数を呼び出すと、受け入れられたソケット上のすべてのイベント コールバック関数が既定で無効になります。 WSK アプリケーションがリッスン ソケットで接続指向ソケット イベント コールバック関数のいずれかを有効にした場合、それらのイベント コールバック関数は、そのリッスン ソケットで受け入れられるすべての接続指向ソケットで既定で有効になります。 受け入れられたソケットのイベント コールバック関数のいずれかを有効にする方法の詳細については、「イベント コールバック関数の有効化と無効化を参照してください。

LocalAddress および RemoteAddress パラメーターが指す SOCKADDR 構造体は、WskAcceptEvent イベント コールバック関数の呼び出しの期間中のみ有効です。 WSK アプリケーションが後でこれらのトランスポート アドレスを必要とする場合は、WskAcceptEvent イベント コールバック関数から戻る前に、これらの構造体の内容を独自の SOCKADDR 構造体にコピーするか、後で受け入れられたソケットで wskGetLocalAddress を呼び出して WskGetRemoteAddress 関数を できます。

WSK サブシステムは、WSK アプリケーションの代わりに、受け入れられた接続のソケット オブジェクト構造 (WSK_SOCKET) にメモリを割り当てます。 WSK サブシステムは、ソケットが閉じられると、このメモリの割り当てを解除します。

WSK サブシステムは、WSK アプリケーションの WskAcceptEvent イベント コールバック関数を IRQL <= DISPATCH_LEVEL で呼び出します。

WSK アプリケーションの WskAcceptEvent イベント コールバック関数は、WSK 完了関数またはイベント コールバック関数のコンテキストで他の WSK 要求の完了を待つ必要はありません。 コールバックは他の WSK 要求を開始できますが (DISPATCH_LEVELで時間がかかりすぎないことを前提とします)、IRQL = PASSIVE_LEVEL でコールバックが呼び出された場合でも、その完了を待つ必要はありません。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista 以降のバージョンの Windows オペレーティング システムで使用できます。
ターゲット プラットフォーム ウィンドウズ
ヘッダー wsk.h (Wsk.h を含む)
IRQL <= DISPATCH_LEVEL

関連項目

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_CLIENT_LISTEN_DISPATCH

WSK_SOCKET

WskAccept

WskCloseSocket

WskControlSocket

WskGetLocalAddress

WskGetRemoteAddress

WskSocket