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

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

10-11 18:27