调用exit
时RAII不会执行析构函数。因此WSACleanup
没有运行,怎么了?我发现libnet
使用WSAStartup
没有任何WSACleanup
,为什么?WSAStartup
可以在一个进程中多次调用,因此如何确保WSACleanup
够吗?
如何轻松优雅地使用WSAStartup
和WSACleanup
?
另外,我没有编写测试WSAStartup
的测试代码WSAClean
,未发现任何异常(内存增长或
崩溃...)
码:
int main(int argc, char *argv[])
{
int res;
while (1) {
WSADATA wsadata;
res = WSAStartup(0x0202, &wsadata);
printf("WSAStartup 1 times:%d\n", res);
if (res != 0) {
printf("WSAStartup error:%d\n", WSAGetLastError());
exit(1);
}
res = WSAStartup(0x0202, &wsadata);
printf("WSAStartup 2 times:%d\n", res);
if (res != 0) {
printf("WSAStartup error:%d\n", WSAGetLastError());
exit(1);
}
}
return 0;
}
最佳答案
1)exit()
是所有RAII的问题,不仅仅是套接字。打开文件,内存...正确的解决方法是避免使用exit()
。
2 + 3)呼叫WSACleanup
和WSAStartup
一样多。我想您想编写一个每个对象一个连接的套接字类,只需在构造函数中调用WSAStartup
在析构函数中调用WSACleanup
。
两种方法都在内部使用呼叫计数器,它们可以毫无问题地处理多个呼叫。
关于c++ - 使用RAII的WSAStartup,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29025713/