WSACleanup 函数 (winsock.h)

WSACleanup 函数终止使用 Winsock 2 DLL (Ws2_32.dll) 。

语法

int WSACleanup();

返回值

如果操作成功,则返回值为零。 否则,将返回值SOCKET_ERROR,并且可以通过调用 WSAGetLastError 检索特定的错误号。

在多线程环境中, WSACleanup 终止所有线程的 Windows 套接字操作。

错误代码 含义
WSANOTINITIALIZED
在使用此函数之前,必须成功调用 WSAStartup
WSAENETDOWN
网络子系统发生故障。
WSAEINPROGRESS
阻止 Windows 套接字 1.1 调用正在进行,或者服务提供商仍在处理回调函数。

注解

应用程序或 DLL 需要执行成功的 WSAStartup 调用,然后才能使用 Windows 套接字服务。 完成 Windows 套接字的使用后,应用程序或 DLL 必须调用 WSACleanup 以从 Windows 套接字实现中注销自身,并允许实现释放代表应用程序或 DLL 分配的任何资源。

调用 WSACleanup 时,将取消此进程中任何线程发出的任何挂起的阻止或异步 Windows 套接字调用,而不会发布任何通知消息或发出任何事件对象的信号。 (WSASendWSASendTo、WSARecvWSARecvFrom 的任何挂起的重叠发送或接收操作(例如,此进程中任何线程发出的) )也会被取消,而无需设置事件对象或调用完成例程(如果指定了一个)。 在这种情况下,挂起的重叠操作会失败,WSA_OPERATION_ABORTED错误状态。

调用 WSACleanup 时打开的套接字将重置并自动解除分配,就像调用 closesocket 一样。 调用 WSACleanup 时,已使用 closesocket 关闭但仍具有待发送数据的套接字可能会受到影响。 在这种情况下,如果在应用程序退出时从内存中卸载 WS2_32.DLL,则挂起的数据可能会丢失。 为了确保发送所有挂起的数据,应用程序应使用 关闭 来关闭连接,然后等待关闭完成,然后再调用 closesocketWSACleanup。 必须解除分配所有资源和内部状态(如排队未发布或已发布的消息),以便可供下一个用户使用。

每次成功调用 WSAStartup 时,都必须调用 WSACleanup。 只有最终 的 WSACleanup 函数调用才会执行实际清理。 前面的调用只是递减 WS2_32.DLL 中的内部引用计数。

注意WSACleanup 不会取消注册对等名称 (对等名称,例如) 可能已注册到 Windows 套接字命名空间提供程序,例如对等名称解析协议 (PNRP) 命名空间提供程序。
 
在 Windows 套接字 1.1 中,尝试从阻塞挂钩中调用 WSACleanup,但未能检查返回代码是常见的编程错误。 如果 Winsock 1.1 应用程序需要在阻止调用未完成时退出,则应用程序必须先使用 WSACancelBlockingCall 取消阻止调用,然后在将控制权返回到应用程序后发出 WSACleanup 调用。 在 Windows 套接字 2 中,此问题不存在, WSACancelBlockingCall 函数已删除。

WSACleanup 函数通常会导致卸载特定于协议的帮助程序 DLL。 因此,不应从应用程序 DLL 中的 DllMain 函数调用 WSACleanup 函数。 这可能会导致死锁。 有关详细信息,请参阅 DLL 主函数

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)
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅

PNRP 命名空间提供程序 API

WSAStartup

Winsock 函数

Winsock 参考

closesocket

shutdown