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

指向调用方分配的 IRP 的指针,WSK 子系统使用该指针以异步方式完成断开连接操作。 有关将 IRP 与 WSK 函数配合使用的详细信息,请参阅 将 IRP 与 Winsock 内核函数配合使用

返回值

WskDisconnect 返回以下 NTSTATUS 代码之一:

返回代码 说明
STATUS_SUCCESS
套接字已成功从远程传输地址断开连接。 IRP 将以成功状态完成。
STATUS_PENDING
WSK 子系统无法立即断开套接字的连接。 WSK 子系统在断开套接字与远程传输地址的连接后,将完成 IRP。 断开连接操作的状态将在 IRP 的 IoStatus.Status 字段中返回。
STATUS_FILE_FORCED_CLOSED
套接字不再正常工作。 IRP 将以失败状态完成。 WSK 应用程序必须调用 WskCloseSocket 函数以尽快关闭套接字。
其他状态代码
出现了错误。 IRP 将以失败状态完成。

注解

WSK 应用程序只能在以前连接到远程传输地址的面向连接的或流套接字上调用 WskDisconnect 函数,或者在它接受的侦听套接字上调用 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