我有一个c ++ win32程序,它使用套接字从服务器下载一些数据.
在Windows上使用套接字之前,必须调用WSAStartup.MSDN说:"每次成功调用WSAStartup都必须调用WSACleanup.只有最后的WSACleanup函数调用才能执行实际的清理."
对我来说最简单的方法是每次从服务器下载数据时都调用WSAStartup/WSACleanup.大多数情况下,一次只有一个连接,因此WSACleanup将执行实际的清理.
这就是为什么我想知道WSAStartup和WSACleanup的成本是多少?我的意思是进行实际清理.如果与整个套接字连接相比,对WSAStartup和WSACleanup的调用只持续很短的时间,那么我可以使用简单的方法.如果没有,我应该在退出程序时注意调用WSACleanup.
可以通过atExit函数注册WSACleanup吗?我们有几个应用程序可以在代码中的不同点终止,因此我们希望避免在代码中将WSACleanup放在任何地方.我们可以通过DllMain调用WSAStartup/WSACleanup,因为我们有一个所有这些应用程序都使用的dll.但是,Microsoft严格建议不要通过DllMain使用WSAStartup/WSACleanup,因为这会导致死锁.我们可以将WSAStarup移出DllMain,并在访问Windows套接字库之前在所有应用程序的代码中的某一点调用它.而且,只要我们调用WSAStartup,我们就想使用atExit函数来注册对WSACleanup的调用.有没有人有这种方法的经验?谢谢!
我有一个Windows套接字程序(XP及更高版本),该程序可以调用WSAStartup
。WSACleanup
在程序退出之前是否需要调用?如果我不这样做,会不会有负面影响?特别是:
WSACleanup();
exit(0);
Run Code Online (Sandbox Code Playgroud)
不同于仅仅exit(0)
。我意识到在Win16 WSACleanup
上仍然会泄漏系统资源。
wsacleanup ×3
wsastartup ×3
atexit ×1
c++ ×1
sockets ×1
tcp ×1
winapi ×1
windows ×1
winsock ×1
winsock2 ×1