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 サブシステムによってキューに入れられます。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 オペレーティング システムで使用できます。 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | wsk.h (Wsk.h を含む) |
IRQL | <= DISPATCH_LEVEL |
関連項目
SOCKADDR の
WSK_CLIENT_CONNECTION_DISPATCHWskAcceptEvent の
WskBind の
WskCloseSocket の
WskSocket の