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 请求完成后,套接字句柄可以传递给 AcceptEx 或 ConnectEx 函数。 注意: 套接字级别断开连接受基础传输行为的约束。 例如,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.1和Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。
要求
要求 | 值 |
---|---|
Header | mswsock.h |