次の方法で共有


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 サブシステムによってキューに入れられます。
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 アプリケーションがリッスン ソケットに対してアプリケーションの WskAcceptEvent イベント コールバック関数を呼び出さないことを WSK アプリケーションが確認する唯一の方法は、ソケットでアプリケーションの 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 オペレーティング システムで使用できます。
対象プラットフォーム ユニバーサル
Header 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