9

我有一个 c++ win32 程序,它使用套接字从服务器下载一些数据。

在 Windows 上使用套接字之前,必须调用 WSAStartup。MSDN 说:“每次成功调用 WSAStartup 都必须调用 WSACleanup。只有最终的 WSACleanup 函数调用执行实际的清理。”

对我来说最简单的方法是每次从服务器下载数据时调用 WSAStartup/WSACleanup。大多数情况下,一次只有一个连接,因此 WSACleanup 将执行实际的清理。

这就是为什么我想知道 WSAStartup 和 WSACleanup 的成本是多少?我的意思是执行实际的清理。如果与整个套接字连接相比,对 WSAStartup 和 WSACleanup 的调用只持续很短的时间,那么我可以使用简单的方法。如果没有,我应该注意仅在退出程序时调用 WSACleanup。

4

3 回答 3

14

WSAStartup() 加载必要的 dll。但如果 dll 已经加载,WSAStartup() 只会增加一个计数器。WSACleanup() 减少计数器并在计数器达到零时释放 dll。

您应该在应用程序的 init 函数中调用 WSAStartup(),并在退出应用程序之前调用 WSACleanup()。

于 2008-12-28T18:37:54.490 回答
3

使用RAII仅在应用程序启动时加载它们一次,然后在退出时释放它们...

于 2009-02-16T11:00:51.297 回答
3

只需调用 WSAStartup 一次,从不清理。说真的,这是 Win3.1 和 Win32s 遗留下来的架构。

于 2008-12-29T01:17:22.437 回答