次の方法で共有


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

WskDisconnect 関数は、接続指向またはストリーム ソケットをリモート トランスポート アドレスから切断します。

構文

PFN_WSK_DISCONNECT PfnWskDisconnect;

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

パラメーター

[in] Socket

切断されているソケットのソケット オブジェクトを指定する WSK_SOCKET 構造体へのポインター。

[in, optional] Buffer

WSK_BUF 構造体へのポインター。 この構造体は、ソケットが切断される前に WSK サブシステムによってリモート トランスポート アドレスに送信されるデータを含むデータ バッファーを記述します。 このようなデータが送信されない場合、WSK アプリケーションは、このポインターを NULLに設定します。 Flags パラメーターにWSK_FLAG_ABORTIVEが指定されている場合、Buffer パラメーターは NULL する必要があります。

[in] Flags

次のフラグまたはゼロを含む ULONG 値。

WSK_FLAG_ABORTIVE

ソケットの中止切断を実行するように WSK サブシステムに指示します。 WSK アプリケーションがこのフラグを指定しない場合、WSK サブシステムはソケットの正常な切断を実行します。

[in, out] Irp

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

戻り値

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

リターン コード 形容
STATUS_SUCCESS
ソケットがリモート トランスポート アドレスから正常に切断されました。 IRP は成功状態で完了します。
STATUS_PENDING
WSK サブシステムは、ソケットをすぐに切断できませんでした。 WSK サブシステムは、リモート トランスポート アドレスからソケットを切断した後、IRP を完了します。 切断操作の状態は、IRP の IoStatus.Status フィールドに返されます。
STATUS_FILE_FORCED_CLOSED
ソケットは機能しなくなりました。 IRP は失敗状態で完了します。 WSK アプリケーションは、WskCloseSocket 関数を呼び出して、できるだけ早くソケットを閉じる必要があります。
その他の状態コードの
エラーが発生しました。 IRP は失敗状態で完了します。

備考

WSK アプリケーションは、以前にリモート トランスポート アドレスに接続した接続指向またはストリーム ソケット、またはリッスン ソケットで受け入れたソケットでのみ、WskDisconnect 関数を呼び出すことができます。

wskDisconnect 、WSK サブシステムは、基になるトランスポートに適した手段を介して、接続が切断されていることをリモート トランスポート アドレスに通知します。 Buffer パラメーターが非NULLの場合、WSK サブシステムは、ソケットを切断する前にバッファー内のデータをリモート トランスポート アドレスに送信します。

正常な切断が実行された場合、WSK サブシステムは、未処理のすべての送信データが送信されるまで待機してから、ソケットを切断します。 ソケットが切断された後、WSK アプリケーションはリモート トランスポート アドレスに追加のデータを送信できません。 ただし、WSK アプリケーションは、リモート アプリケーションがソケットの末尾を切断するまで、リモート トランスポート アドレスから追加のデータを受信できます。

すべてのトランスポートがハーフオープン接続をサポートしているわけではないことに注意してください。 トランスポートがハーフオープン接続をサポートしていない場合、WSK アプリケーションは、グレースフル切断が実行された後、リモート トランスポート アドレスから追加のデータを受信しません。

正常な切断では、IRP は、トランスポート プロトコルによって切断操作が完全に完了した場合にのみ完了します。 一部のトランスポート プロトコルでは、リモート トランスポート アドレスにデータを送信する際に問題が発生した場合、IRP が完了しない可能性があります。 このような場合、WSK アプリケーションは、WskDisconnect 関数をもう一度呼び出し、WSK_FLAG_ABORTIVE フラグを指定するか、WskCloseSocket 関数を呼び出すことによって復旧できます。 いずれの場合も、WSK サブシステムはソケットを中止し、保留中の IRP を強制的に完了します。

中止切断が実行された場合、WSK サブシステムはすべての進行中および保留中の送信操作を取り消し、ソケットの切断を待機しません。 中止切断後、WSK アプリケーションは、リモート トランスポート アドレスに追加のデータを送信したり、リモート トランスポート アドレスから追加のデータを受信したりすることはできません。

WSK アプリケーションは、WskCloseSocket 関数を呼び出すことによって、接続を完全に閉じることができます。

必要条件

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

関連項目

WSK_BUF

WSK_PROVIDER_CONNECTION_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskCloseSocket

WskConnect

WskDisconnectEvent

WskSocketConnect