gpt4 book ai didi

c++ - 使用 RAII 启动 WSA

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:36 24 4
gpt4 key购买 nike

  1. RAII 在调用 exit 时不执行析构函数。所以 WSACleanup不运行。有什么问题?我发现 libnet 使用 WSAStartup没有任何 WSACleanup,为什么?
  2. WSAStartup 可以在一个进程中调用多次,那么如何保证WSACleanup 够了吗?
  3. 如何轻松优雅地使用WSAStartupWSACleanup
  4. 另外,我已经为测试 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) 调用与WSAStartup 一样多的WSACleanup。我猜您想编写一个每个对象都有一个连接的套接字类,只需在构造函数中调用 WSAStartup 并在析构函数中调用 WSACleanup
这两种方法都在内部使用调用计数器,它们可以毫无问题地处理多个调用。

关于c++ - 使用 RAII 启动 WSA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29025713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com