关闭函数 (winsock.h)

关闭函数禁用套接字上的发送或接收。

语法

int shutdown(
  [in] SOCKET s,
  [in] int    how
);

参数

[in] s

标识套接字的描述符。

[in] how

描述不再允许哪些类型的操作的标志。 Winsock2.h 头文件中列出了此标志的可能值。

含义
SD_RECEIVE
0
关闭接收操作。
SD_SEND
1
关闭发送操作。
SD_BOTH
2
关闭发送和接收操作。

返回值

如果未发生错误, 关闭 将返回零。 否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

错误代码 含义
WSAECONNABORTED
由于超时或其他故障,虚拟线路已终止。 因为套接字不可再用,应用程序应关闭套接字。

此错误仅适用于面向连接的套接字。

WSAECONNRESET
执行硬性或异常关闭的远程端重置了虚拟线路。 因为套接字不可再用,应用程序应关闭套接字。

此错误仅适用于面向连接的套接字。

WSAEINPROGRESS
阻止 Windows Sockets 1.1 调用正在进行,或者服务提供程序仍在处理回调函数。
WSAEINVAL
how 参数无效,或者与套接字类型不一致。 例如,SD_SEND与UNI_RECV套接字类型一起使用。
WSAENETDOWN
网络子系统失败。
WSAENOTCONN
套接字未连接。 此错误仅适用于面向连接的套接字。
WSAENOTSOCK
注意 描述符不是套接字。
 
WSANOTINITIALISED
在使用此函数之前,必须成功调用 WSAStartup

注解

关闭函数用于所有类型的套接字,以禁用接收和/或传输。

如果 how 参数SD_RECEIVE,则不允许对套接字上的 recv 函数进行后续调用。 这不会影响较低的协议层。 对于 TCP 套接字,如果套接字上仍有数据排队等待接收,或者数据随后到达,则会重置连接,因为无法将数据传递给用户。 对于 UDP 套接字,接受传入数据报并排队。 在任何情况下都不会生成 ICMP 错误数据包。

如果 how 参数SD_SEND,则不允许对 send 函数的后续调用。 对于 TCP 套接字,接收方发送并确认所有数据后,将发送 FIN。

设置 如何 SD_BOTH将禁用发送和接收,如上所述。

关闭函数不会关闭套接字。 在调用 closesocket 之前,不会释放附加到套接字的任何资源。

为了确保在连接的套接字关闭之前发送和接收所有数据,应用程序应在调用 closesocket 之前使用关闭来关闭连接。 一种等待远程端已发送其所有数据并启动正常断开连接的通知的方法使用 WSAEventSelect 函数,如下所示:

  1. 调用 WSAEventSelect 以注册FD_CLOSE通知。
  2. 使用 how=SD_SEND 调用 shutdown
  3. 收到FD_CLOSE时,调用 recvWSARecv ,直到函数成功完成并指示已收到零个字节。 如果返回SOCKET_ERROR,则无法正常断开连接。
  4. 调用 closesocket
另一种等待远程端已发送其所有数据并启动正常断开连接的通知的方法如下:
  1. 使用 how=SD_SEND 调用 shutdown
  2. 调用 recvWSARecv ,直到函数成功完成并指示已收到零个字节。 如果返回SOCKET_ERROR,则无法正常断开连接。
  3. 调用 closesocket
注意 无论套接字上的SO_LINGER设置如何, 关闭 函数都不会阻止。
 

有关详细信息,请参阅有关 正常关闭、挂起选项和套接字关闭的部分。

一旦调用 关闭 函数来禁用发送和/或接收,就没有方法可以重新为现有套接字连接启用发送或接收。

应用程序不应依赖于在关闭套接字后能够重用套接字的功能。 具体而言,Windows 套接字提供程序不需要支持在已关闭的套接字上使用 连接

如果应用程序想要重用套接字,则应调用 DisconnectEx 函数,并将 dwFlags 参数设置为 TF_REUSE_SOCKET 以关闭套接字上的连接,并准备要重复使用的套接字句柄。 DisconnectEx 请求完成后,套接字句柄可以传递给 AcceptExConnectEx 函数。

如果应用程序想要重复使用套接字,则可以使用使用 TF_DISCONNECT 设置的 dwFlags 参数调用 TransmitFileTransmitPackets 函数,并在所有数据排队等待传输后TF_REUSE_SOCKET断开连接,并准备要重复使用的套接字句柄。 当 TransmitFile 请求完成时,套接字句柄可以传递给以前用于建立连接的函数调用,例如 AcceptExConnectEx当 TransmitPackets 函数完成时,套接字句柄可以传递给 AcceptEx 函数。

注意 套接字级别断开连接受基础传输行为的约束。 例如,TCP 套接字可能受 TCP TIME_WAIT状态的约束,从而导致 DisconnectExTransmitFileTransmitPackets 调用延迟。
 
注意 发出阻止 Winsock 调用(如 关闭)时,Winsock 可能需要等待网络事件,然后调用才能完成。 在这种情况下,Winsock 执行可发出警报的等待, (在同一线程上计划的 APC) 异步过程调用可能会中断该等待。 在 APC 内发出另一个阻止 Winsock 调用,该调用中断了同一线程上正在进行的阻止 Winsock 调用将导致未定义的行为,并且 Winsock 客户端绝不能尝试。
 

ATM 说明

使用异步传输模式 (ATM) 和 Windows 套接字 2 时,存在与连接断开相关的重要问题。 有关这些重要注意事项的详细信息,请参阅 closesocket 函数参考的“备注”部分中标题为 ATM 的备注部分。

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

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

要求

要求
最低受支持的客户端 Windows 8.1、Windows Vista [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 winsock.h (包括 Winsock2.h、Webhost.h)
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅

AcceptEx

ConnectEx

DisconnectEx

TransmitFile

TransmitPackets

WSAEventSelect

Winsock 函数

Winsock 参考

connect

socket