LPFN_DISCONNECTEX回调函数 (mswsock.h)

DisconnectEx 函数关闭套接字上的连接,并允许重复使用套接字句柄。

注意

此函数是 Windows 套接字规范中特定于 Microsoft 的扩展。

语法

LPFN_DISCONNECTEX LpfnDisconnectex;

BOOL LpfnDisconnectex(
  SOCKET s,
  LPOVERLAPPED lpOverlapped,
  DWORD dwFlags,
  DWORD dwReserved
)
{...}

参数

s

连接的面向连接的套接字的句柄。

lpOverlapped

指向 OVERLAPPED 结构的指针。 如果套接字句柄已作为重叠打开,则指定此参数会导致 (异步) I/O 操作重叠。

dwFlags

一组标志,用于自定义函数调用的处理。 如果此参数设置为零,则不设置任何标志。 dwFlags 参数可以具有以下值。

标志 含义
TF_REUSE_SOCKET 准备要重复使用的套接字句柄。 DisconnectEx 请求完成后,套接字句柄可以传递给 AcceptExConnectEx 函数。
注意: 套接字级别断开连接受基础传输行为的约束。 例如,TCP 套接字可能受 TCP TIME_WAIT状态的约束,从而导致 DisconnectEx 调用延迟。

dwReserved

保留。 必须为零。 如果不是零值,则返回 WSAEINVAL

返回值

成功后, DisconnectEx 函数返回 TRUE。 失败时,函数返回 FALSE。 使用 WSAGetLastError 函数获取扩展错误信息。 如果对 WSAGetLastError 函数的调用返回 ERROR_IO_PENDING,则表示操作已成功启动并正在进行中。 在这种情况下,当操作完成时,调用可能仍然失败。

错误代码 说明
WSAEFAULT 系统在尝试使用指针参数时检测到指针地址无效。 如果在 lpOverlapped 参数中传递了无效的指针值,则返回此错误。
WSAEINVAL 传递的参数无效。 如果 dwFlags 参数指定了除 TF_REUSE_SOCKET 以外的零值,则返回此错误。
WSAENOTCONN 套接字未连接。 如果套接字 s 参数未处于连接状态,则返回此错误。 如果套接字处于上一个请求的传输关闭状态,并且 dwFlags 参数未设置为 TF_REUSE_SOCKET 以请求重用套接字,则也可能返回此错误。

注解

DisconnectEx 函数不支持数据报套接字。 因此, hSocket 指定的套接字必须面向连接,例如SOCK_STREAM、SOCK_SEQPACKET或SOCK_RDM套接字。

注意

DisconnectEx 函数的函数指针必须在运行时通过调用 WSAIoctl 函数并指定SIO_GET_EXTENSION_FUNCTION_POINTER操作码来获取。 传递给 WSAIoctl 函数的输入缓冲区必须包含 WSAID_DISCONNECTEX,这是一个全局唯一标识符 (GUID) 其值标识 DisconnectEx 扩展函数。 成功后, WSAIoctl 函数返回的输出包含指向 DisconnectEx 函数的指针。 WSAID_DISCONNECTEX GUID 在 Mswsock.h 头文件中定义。

lpOverlapped 不为 NULL 时,重叠 I/O 可能不会在 DisconnectEx 返回之前完成,从而导致 DisconnectEx 函数返回 FALSE ,并且调用 WSAGetLastError 函数返回 ERROR_IO_PENDING。 此设计使调用方能够在断开连接操作完成时继续处理。 完成请求后,Windows 将 OVERLAPPED 结构的 hEvent 成员指定的事件或 hSocket 指定的套接字设置为信号状态。

注意

当给定线程退出时,将取消由给定线程启动的所有 I/O。 对于重叠套接字,如果在操作完成之前关闭线程,挂起的异步操作可能会失败。 有关详细信息 ,请参阅 ExitThread

TIME_WAIT状态确定 TCP 释放已关闭的连接并重复使用其资源之前必须经过的时间。 关闭和释放之间的此间隔称为TIME_WAIT状态或 2MSL 状态。 在此期间,与建立新连接相比,重新打开连接时,客户端和服务器的成本要低得多。 TIME_WAIT行为在 RFC 793 中指定,它要求 TCP 保持关闭连接的间隔至少等于网络 MSL) 最大段生存期 (两倍。 释放连接后,其套接字对和用于套接字的内部资源可用于支持另一个连接。

在连接关闭后,Windows TCP 将还原为TIME_WAIT状态。 处于TIME_WAIT状态时,不能重用套接字对。 可以通过修改以下 DWORD 注册表设置来配置TIME_WAIT周期,该 DWORD 注册表设置以秒为单位表示TIME_WAIT周期。

\ HKEY_LOCAL_MACHINE系统\CurrentControlSet\服务\TCPIP\参数\TcpTimedWaitDelay

默认情况下,MSL 定义为 120 秒。 TcpTimedWaitDelay 注册表设置默认为值 240 秒,表示 120 秒或 4 分钟的最长段生存期的 2 倍。 但是,可以使用此项来自定义间隔。 通过减少此项的值,TCP 可以更快地释放已关闭的连接,为新连接提供更多资源。 但是,如果该值太低,TCP 可能会在连接完成之前释放连接资源,从而要求服务器使用其他资源来重新建立连接。 可以将此注册表设置设置为 0 到 300 秒。

Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

要求

要求
Header mswsock.h