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 コードを返します。
リターン コード | 説明 |
---|---|
|
受信接続が正常に受け入れられました。 IRP は成功状態で完了します。 |
|
IRP は、リッスンしているソケットで受信接続を待機している WSK サブシステムによってキューに入れられます。 |
|
ソケットは機能しなくなりました。 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 フィールドには、受け入れられたソケットのソケット オブジェクトへのポインターが含まれています。
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 |