LPWSPCLOSESOCKET 回调函数 (ws2spi.h)
LPWSPCloseSocket 函数关闭套接字。
语法
LPWSPCLOSESOCKET Lpwspclosesocket;
int Lpwspclosesocket(
[in] SOCKET s,
[out] LPINT lpErrno
)
{...}
参数
[in] s
标识套接字的描述符。
[out] lpErrno
指向错误代码的指针。
返回值
如果未发生错误, LPWSPCloseSocket 将返回零。 否则,返回值 SOCKET_ERROR,并在 lpErrno 中提供特定的错误代码。
错误代码 | 含义 |
---|---|
网络子系统失败。 | |
正在阻止 Windows 套接字调用,或者服务提供程序仍在处理回调函数。 | |
:描述符不是套接字。 | |
套接字标记为非阻止,SO_LINGER设置为非零超时值。 |
注解
此函数关闭套接字。 更确切地说,它会释放套接字描述符 ,因此对 的 进一步引用应失败并出现错误 WSAENOTSOCK。 如果这是对基础套接字的最后一次引用,则会丢弃关联的命名信息和排队数据。 此过程中的任何线程 (在套接字上挂起的任何阻塞或异步调用) 将被取消,而不会发布任何通知消息。 此进程中任何线程发出的任何挂起的重叠操作也会被取消。 为这些重叠操作指定的任何完成操作都会 (执行,例如事件、完成例程或完成端口) 。 在这种情况下,挂起的重叠操作失败,错误状态 WSA_OPERATION_ABORTED 。 调用 LPWSPCloseSocket 后,不会发布FD_CLOSE。
LPWSPCloseSocket 行为汇总如下:
如果启用SO_DONTLINGER (默认设置) , 则 LPWSPCloseSocket 将立即返回,并在后台正常关闭连接。
如果启用SO_LINGER且超时为零, 则 LPWSPCloseSocket 将立即返回并重置/终止连接。
或
如果启用SO_LINGER且具有阻止套接字的非零超时, 则 LPWSPCloseSocket 会一直阻止,直到发送所有数据或超时过期。
如果启用SO_LINGER且具有非阻止套接字的非零超时, 则 LPWSPCloseSocket 将立即返回,从而指示失败。
LPWSPCloseSocket 的语义受套接字选项SO_LINGER和SO_DONTLINGER的影响,如下所示。
选项 | 时间间隔 | 关闭类型 | 等待关闭? |
---|---|---|---|
SO_DONTLINGER | 不在乎 | 常规 | 否 |
SO_LINGER | 零个 | 硬色调 | 否 |
SO_LINGER | 非零 | 常规 | 是 |
如果设置SO_LINGER (,则 linger 结构的 l_onoff 成员为非零) 并且超时间隔 (l_linger)为零,则即使尚未发送或确认排队的数据,也不会阻止 LPWSPCloseSocket 。 这称为硬关闭或中止关闭,因为套接字的虚拟线路会立即重置,并且任何未发送的数据都将丢失。 线路远程端的任何 LPWSPRecv 调用都将失败,并出现 WSAECONNRESET。
如果SO_LINGER设置为阻止套接字上的非零超时间隔,则 LPWSPCloseSocket 调用将阻止阻止套接字,直到发送剩余数据或超时到期为止。 这称为正常断开连接。 如果超时在发送所有数据之前过期,则服务提供商应在 LPWSPCloseSocket 返回之前终止连接。
不建议在非阻塞套接字上启用具有非零超时间隔的SO_LINGER。 在这种情况下,如果无法立即完成关闭操作,对 LPWSPCloseSocket 的调用将失败,并显示 WSAEWOULDBLOCK 错误。 如果 LPWSPCloseSocket 失败并出现 WSAEWOULDBLOCK,则套接字句柄仍然有效,并且不会启动断开连接。
Winsock SPI 客户端必须再次调用 LPWSPCloseSocket 才能关闭套接字,但除非 Winsock SPI 客户端执行以下操作之一,否则 LPWSPCloseSocket 可能会继续失败:
- 禁用SO_DONTLINGER。
- 启用零超时SO_LINGER。
- 调用 LPWSPShutdown 以启动关闭。
如果在流套接字上设置SO_DONTLINGER (即,linger 结构的 l_onoff 成员为零) ,则无论套接字是阻塞还是非阻塞, LPWSPCloseSocket 调用都将立即返回,并且不会获取 WSAEWOULDBLOCK。 但是,如果可能,将在关闭基础套接字之前发送排队等待传输的任何数据。 这称为正常断开连接,是默认行为。
请注意,在这种情况下,允许 Winsock 提供程序保留与套接字关联的任何资源,直到正常断开连接完成或提供程序因在提供程序确定的时间量内无法完成操作而终止连接。 这可能会影响预期使用所有可用套接字的 Winsock 客户端。 这是默认行为;默认设置SO_DONTLINGER。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
标头 | ws2spi.h |