关闭函数 (winsock2.h)
关闭函数禁用对套接字的发送或接收。
语法
int WSAAPI shutdown(
[in] SOCKET s,
[in] int how
);
参数
[in] s
标识套接字的描述符。
[in] how
描述不再允许哪些类型的操作的标志。 Winsock2.h 头文件中列出了此标志的可能值。
值 | 含义 |
---|---|
|
关闭接收操作。 |
|
关闭发送操作。 |
|
关闭发送和接收操作。 |
返回值
如果未发生错误, 关闭 将返回零。 否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 检索特定的错误代码。
错误代码 | 含义 |
---|---|
由于超时或其他故障,虚拟线路已终止。 因为套接字不可再用,应用程序应关闭套接字。
此错误仅适用于面向连接的套接字。 |
|
执行硬性或异常关闭的远程端重置了虚拟线路。 因为套接字不可再用,应用程序应关闭套接字。
此错误仅适用于面向连接的套接字。 |
|
阻止 Windows 套接字 1.1 调用正在进行,或者服务提供商仍在处理回调函数。 | |
如何参数无效,或者与套接字类型不一致。 例如,SD_SEND与 UNI_RECV 套接字类型一起使用。 | |
网络子系统发生故障。 | |
套接字未连接。 此错误仅适用于面向连接的套接字。 | |
注意 描述符不是套接字。
|
|
在使用此函数之前,必须成功调用 WSAStartup 。 |
备注
关闭功能用于所有类型的套接字,以禁用接收和/或传输。
如果 how 参数SD_RECEIVE,则禁止对套接字上的 recv 函数的后续调用。 这不会影响较低的协议层。 对于 TCP 套接字,如果套接字上仍有数据排队等待接收,或者数据随后到达,则会重置连接,因为无法将数据传递给用户。 对于 UDP 套接字,接受传入数据报并排队。 在任何情况下都不会生成 ICMP 错误数据包。
如果 如何 SD_SEND参数,则不允许对 send 函数的后续调用。 对于 TCP 套接字,在接收方发送并确认所有数据后,将发送 FIN。
设置 如何 SD_BOTH将如上所述禁用发送和接收。
关闭函数不会关闭套接字。 在调用 closesocket 之前,不会释放附加到套接字的任何资源。
为了确保所有数据在连接的套接字关闭之前发送和接收,应用程序应在调用 closesocket 之前使用关闭来关闭连接。 一种等待远程端已发送其所有数据并启动正常断开连接的通知的方法使用 WSAEventSelect 函数,如下所示:
- 调用 WSAEventSelect 注册FD_CLOSE通知。
- 使用 how=SD_SEND 调用关闭。
- 收到FD_CLOSE时,调用 recv 或 WSARecv ,直到函数成功完成并指示已接收零个字节。 如果返回SOCKET_ERROR,则无法正常断开连接。
- 调用 closesocket。
- 使用 how=SD_SEND 调用关闭。
- 调用 recv 或 WSARecv ,直到函数成功完成并指示已接收零个字节。 如果返回SOCKET_ERROR,则无法正常断开连接。
- 调用 closesocket。
有关详细信息,请参阅有关 正常关闭、挂起选项和套接字关闭的部分。
调用 关闭 函数以禁用发送和/或接收后,没有方法可以重新为现有套接字连接启用发送或接收。
应用程序不应依赖于在关闭套接字后能够重用套接字的功能。 具体而言,不需要 Windows 套接字提供程序来支持在已关闭的套接字上使用 连接 。
如果应用程序想要重用套接字,则应调用 DisconnectEx 函数,并将 dwFlags 参数设置为 TF_REUSE_SOCKET 以关闭套接字上的连接,并准备要重复使用的套接字句柄。 DisconnectEx 请求完成后,套接字句柄可以传递给 AcceptEx 或 ConnectEx 函数。
如果应用程序想要重用套接字,可以使用使用 TF_DISCONNECT 设置的 dwFlags 参数调用 TransmitFile 或 TransmitPackets 函数,并在所有数据排队传输并准备要重复使用的套接字句柄后TF_REUSE_SOCKET断开连接。 当 TransmitFile 请求完成时,套接字句柄可以传递给先前用于建立连接的函数调用,例如 AcceptEx 或 ConnectEx。 当 TransmitPackets 函数完成时,套接字句柄可以传递给 AcceptEx 函数。
ATM 说明
使用异步传输模式 (ATM) 和 Windows 套接字 2 时,存在与连接断开相关的重要问题。 有关这些重要注意事项的详细信息,请参阅 closesocket 函数参考的“备注”部分中的标题为 ATM 的备注部分。Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。
Windows 8.1 和 Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此功能。
要求
最低受支持的客户端 | Windows 8.1,Windows Vista [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | winsock2.h (包括 Winsock2.h、Webhost.h) |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |