次の方法で共有


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 オペレーティング システムで使用できます。
対象プラットフォーム 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