次の方法で共有


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

WskAccept 関数は、リッスン しているソケットで受信接続を受け入れます。

構文

PFN_WSK_ACCEPT PfnWskAccept;

NTSTATUS PfnWskAccept(
  [in]            PWSK_SOCKET ListenSocket,
                  ULONG Flags,
  [in, optional]  PVOID AcceptSocketContext,
  [in, optional]  const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
  [out, optional] PSOCKADDR LocalAddress,
  [out, optional] PSOCKADDR RemoteAddress,
  [in, out]       PIRP Irp
)
{...}

パラメーター

[in] ListenSocket

受信接続を確認するリッスンソケットまたはストリーム ソケットのソケット オブジェクトを指定する WSK_SOCKET 構造体へのポインター。

Flags

このパラメーターは、システム用に予約されています。 WSK アプリケーションでは、このパラメーターを 0 に設定する必要があります。

[in, optional] AcceptSocketContext

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

[in, optional] AcceptSocketDispatch

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

[out, optional] LocalAddress

着信接続が到着したローカル トランスポート アドレスを受信する呼び出し元によって割り当てられたバッファーへのポインター。 バッファーは、ページ以外のメモリに配置する必要があります。 また、バッファーは、WSK アプリケーションがリッスン ソケットの作成時に指定したアドレス ファミリに対応する特定の SOCKADDR 構造体型を格納するのに十分な大きさにする必要があります。 このポインターは省略可能であり、NULL できます。

[out, optional] RemoteAddress

着信接続の送信元のリモート トランスポート アドレスを受け取る、呼び出し元によって割り当てられたバッファーへのポインター。 バッファーは、ページ以外のメモリに配置する必要があります。 また、バッファーは、WSK アプリケーションがリッスン ソケットの作成時に指定したアドレス ファミリに対応する特定の SOCKADDR 構造体型を格納するのに十分な大きさにする必要があります。 このポインターは省略可能であり、NULL できます。

[in, out] Irp

WSK サブシステムが受け入れ操作を非同期的に完了するために使用する、呼び出し元によって割り当てられた IRP へのポインター。 WSK 関数で IRP を使用する方法の詳細については、「Winsock カーネル関数での IRP の使用」を参照してください。

戻り値

WskAccept は、次のいずれかの NTSTATUS コードを返します。

リターン コード 形容
STATUS_SUCCESS
受信接続が正常に受け入れられました。 IRP は成功状態で完了します。
STATUS_PENDING
IRP は WSK サブシステムによってキューに入れられます。WSK サブシステムは、リッスン しているソケットで受信接続を待機しています。
STATUS_FILE_FORCED_CLOSED
ソケットは機能しなくなりました。 IRP は失敗状態で完了します。 WSK アプリケーションは、WskCloseSocket 関数を呼び出して、できるだけ早くソケットを閉じる必要があります。
その他の状態コードの
エラーが発生しました。 IRP は失敗状態で完了します。

備考

WSK アプリケーションは、WskBind 関数を呼び出すことによって、以前にローカル トランスポート アドレスにバインドされたリッスン ソケットまたはストリーム ソケットで、WskAccept 関数を呼び出すことができます。

WskAccept 関数の動作は、受信接続がリッスン ソケットで受け入れられるのを待機しているかどうかによって異なります。

  • 受信接続が既にリッスン ソケットに到着しており、受け入れられるのを待機している場合、wskAccept 関数 はSTATUS_SUCCESSを返します。 この状況では、IRP は成功状態で完了し、IRP の IoStatus.Information フィールドには、受け入れられたソケットのソケット オブジェクトへのポインターが含まれています。
  • 受信接続がリッスン ソケットで受け入れられるのを待っていない場合、wskAccept はSTATUS_PENDINGを返し、WSK サブシステムは受信接続を受信するまで IRP をキューに入れます。 受信接続を受信すると、WSK サブシステムは、成功状態の IRP を非同期的に完了します。 この状況では、IRP の IoStatus.Information フィールドには、受け入れられたソケットのソケット オブジェクトへのポインターが含まれています。
WSK アプリケーションの WskAcceptEvent イベント コールバック関数がリッスン ソケットで有効になっていて、アプリケーションが同じリッスン ソケットで WskAccept 関数の保留中の呼び出しを行っている場合、受信接続が到着すると、WskAccept への保留中の呼び出WskAcceptEvent イベント コールバック関数よりも優先されます。 WSK サブシステムは、WskAccept への保留中の呼び出しからキューに入れられた IRP がない場合にのみ、アプリケーションの WskAcceptEvent イベント コールバック関数呼び出します。 ただし、WSK アプリケーションでは、wskAccept 関数の 呼び出しが保留中のリッスン ソケットに対して、WSK サブシステムがアプリケーションの WskAcceptEvent イベント コールバック関数を呼び出さないと想定しないでください。 WSK サブシステムが WSK アプリケーションの WskAcceptEvent ソケットのイベント コールバック関数を呼び出すことができる競合状態が存在します。 WSK アプリケーションで、WSK サブシステムがリッスン ソケットに対してアプリケーションの WskAcceptEvent イベント コールバック関数を呼び出さない唯一の方法は、ソケットでアプリケーションの WskAcceptEvent イベント コールバック関数を無効にすることです。

WskAccept 関数が受信接続を正常に受け入れると、受け入れられたソケット上のすべてのイベント コールバック関数が既定で無効になります。 受け入れられたソケットのイベント コールバック関数のいずれかを有効にする方法の詳細については、「イベント コールバック関数の有効化と無効化を参照してください。

WSK アプリケーションが、LocalAddress パラメーター、RemoteAddress パラメーター、または両方のパラメーターで非NULL ポインターを指定し、wskAccept STATUS_PENDINGを返す場合、IRP が完了するまで、それらのパラメーターによって指されるバッファーは有効なままである必要があります。 WSK アプリケーションが、ExAllocateXxx 関数のいずれかを使用してバッファーを割り当てた場合、IRP が完了するまで、対応する ExFreeXxx 関数を使用してメモリを解放できません。 WSK アプリケーションは、スタック上のバッファーを割り当てた場合、IRP が完了するまで、WskAccept 関数を呼び出す関数から返すことはできません。

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

必要条件

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

関連項目

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAcceptEvent

WskBind

WskCloseSocket

WskSocket