次の方法で共有


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

WskReceive 関数は、リモート トランスポート アドレスから接続指向またはストリーム ソケット経由でデータを受信します。

構文

PFN_WSK_RECEIVE PfnWskReceive;

NTSTATUS PfnWskReceive(
  [in]      PWSK_SOCKET Socket,
  [in]      PWSK_BUF Buffer,
  [in]      ULONG Flags,
  [in, out] PIRP Irp
)
{...}

パラメーター

[in] Socket

データを受信するソケットのソケット オブジェクトを指定する WSK_SOCKET 構造体へのポインター。

[in] Buffer

ソケットからデータを受信するデータ バッファーを記述する初期化された WSK_BUF 構造体へのポインター。

[in] Flags

次のフラグの組み合わせのビットごとの OR を含む ULONG 値。

WSK_FLAG_WAITALL

データ バッファーがいっぱいになるまで待ちます。 このフラグを指定した場合、Irp パラメーターで指定された IRP は、次のいずれかのイベントが発生するまで完了しません。

  • Buffer パラメーターによって指されるWSK_BUF構造体によって記述されるデータ バッファー が完全に入力されます。
  • 接続はリモート送信者によって正常に切断されます。
  • 接続は、WSK アプリケーションまたはリモート送信者によって中止されます。
  • 指定した IRP が取り消されます。
このフラグは、Microsoft TCP/IP トランスポート プロトコルでサポートされています。 このフラグは、他のトランスポート プロトコルではサポートされていない可能性があります。

WSK_FLAG_DRAIN

ソケットが切断されるまで待ち、ソケットで受信したデータを破棄します。 このフラグを指定すると、次のいずれかのイベントが発生するまで、指定した IRP は完了しません。

  • 接続はリモート送信者によって正常に切断されます。
  • 接続は、WSK アプリケーションまたはリモート送信者によって中止されます。
  • 指定した IRP が取り消されます。
受信したデータは、WSK サブシステムによって破棄されます。 受信したデータはデータ バッファーにコピーされません。 このフラグを指定しても Buffer パラメーターは必要ですが、WSK_BUF構造体で記述されるバッファーの長さは 0 である必要があります。

このフラグは、Microsoft TCP/IP トランスポート プロトコルでサポートされています。 このフラグは、他のトランスポート プロトコルではサポートされていない可能性があります。

WSK_FLAG_WAITALLフラグとWSK_FLAG_DRAIN フラグは相互に排他的です。 WSK アプリケーションでは、これらのフラグの両方を同時に指定しないでください。

[in, out] Irp

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

戻り値

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

リターン コード 説明
STATUS_SUCCESS
ソケットからデータが正常に受信されました。 IRP は成功状態で完了します。 IRP の IoStatus.Information フィールドには、受信したバイト数が含まれています。
STATUS_PENDING
WSK サブシステムは、ソケットからすぐにデータを受信できませんでした。 WSK サブシステムは、ソケットからデータを受信した後、IRP を完了します。 受信操作の状態は、IRP の IoStatus.Status フィールドに返されます。 操作が成功した場合、IRP の IoStatus.Information フィールドには、受信したバイト数が含まれます。
STATUS_FILE_FORCED_CLOSED
ソケットは機能しなくなりました。 IRP は失敗状態で完了します。 WSK アプリケーションは、できるだけ早くソケットを閉じる には、WskCloseSocket 関数を呼び出す必要があります。
STATUS_NOT_SUPPORTED
指定したフラグは、基になるネットワーク トランスポートではサポートされていません。
その他の状態コード
エラーが発生しました。 IRP は失敗状態で完了します。

注釈

WSK アプリケーションは、以前にリモート トランスポート アドレスに接続されている接続指向またはストリーム ソケットでのみ WskReceive 関数を呼び出すことができます。 接続指向ソケットは、次のいずれかの方法でリモート トランスポート アドレスに接続されます。

  • WSK アプリケーションは、 WskConnect 関数を呼び出してソケットを接続します。
  • WSK アプリケーションは、 WskSocketConnect 関数を呼び出してソケットを作成、バインド、接続します。
  • WSK アプリケーションがリッスンしているソケットで受信接続要求を受け入れると、WSK サブシステムはソケットを接続します。
WSK アプリケーションの WskReceiveEvent イベント コールバック関数が接続指向ソケットで有効になっており、アプリケーションで同じ接続指向ソケット上の WskReceive 関数の呼び出しも保留中の場合、データが到着すると、 WskReceive 関数の保留中の呼び出しが WskReceiveEvent イベント コールバック関数よりも優先されます。 WSK サブシステムは、アプリケーションの WskReceiveEvent イベント コールバック関数を呼び出します。これは、 WskReceive 関数の保留中の呼び出しからキューに登録された IRP がない場合のみです。 ただし、WSK アプリケーションでは、WskReceive 関数の呼び出しが保留中の接続指向ソケットに対して、WSK サブシステムがアプリケーションの WskReceiveEvent イベント コールバック関数を呼び出さないと想定しないでください。 競合状態は、WSK サブシステムがソケットの WSK アプリケーションの WskReceiveEvent イベント コールバック関数を引き続き呼び出すことができる場所に存在します。 WSK アプリケーションが接続指向ソケットに対してアプリケーションの WskReceiveEvent イベント コールバック関数を呼び出さないことを WSK アプリケーションが確認する唯一の方法は、ソケットでアプリケーションの WskReceiveEvent イベント コールバック関数を無効にすることです。

WSK アプリケーションは、Buffer パラメーターによって指されるWSK_BUF構造体の Length メンバーで指定された長さ 0 の WskReceive 関数を呼び出すことができます。 このメンバーに長さ 0 を指定すると、次の状況で役立ちます。

  • 以前に返された WskReceiveEvent イベント コールバック関数の後にソケットに対して WskReceiveEvent イベント コールバック関数を再度有効にするとSTATUS_DATA_NOT_ACCEPTED
  • ソケットで受信した追加データを破棄するWSK_FLAG_DRAIN フラグを指定する場合
WskReceive 関数がSTATUS_PENDINGを返す場合は、 Buffer パラメーターによって指されるWSK_BUF構造体に記述されている MDL チェーンは、IRP が完了するまでメモリ内でロックされたままにする必要があります。

要件

要件
サポートされている最小のクライアント Windows Vista 以降のバージョンの Windows オペレーティング システムで使用できます。
対象プラットフォーム ユニバーサル
Header wsk.h (Wsk.h を含む)
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

WSK_BUF

WSK_PROVIDER_CONNECTION_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskCloseSocket

WskReceiveEvent

WskSend