C++ 在网络库中初始化Winsock的最佳实践

C++ 在网络库中初始化Winsock的最佳实践,c++,sockets,networking,network-programming,winsock2,C++,Sockets,Networking,Network Programming,Winsock2,我正在编写一个小型库,它在内部使用OS socket API进行一些联网 在Windows上,需要在开始时调用WSAStartup,在结束时调用WSACleanup来初始化Winsock。但是,它说它可以多次初始化Winsock,然后清除相同次数的内容,因为它在内部使用引用计数 现在我正在解决一个难题。图书馆作家的最佳实践是什么 提供全局函数initializeLibrary/terminateLibrary,该函数调用WSAStartup/WSACleanup,并指示用户在应用程序开始/结束时

我正在编写一个小型库,它在内部使用OS socket API进行一些联网

在Windows上,需要在开始时调用
WSAStartup
,在结束时调用
WSACleanup
来初始化Winsock。但是,它说它可以多次初始化Winsock,然后清除相同次数的内容,因为它在内部使用引用计数

现在我正在解决一个难题。图书馆作家的最佳实践是什么

  • 提供全局函数
    initializeLibrary
    /
    terminateLibrary
    ,该函数调用
    WSAStartup
    /
    WSACleanup
    ,并指示用户在应用程序开始/结束时调用它们
  • 在我的类的构造函数/析构函数中内部调用
    WSAStartup
    /
    WSACleanup
    ,根本不必麻烦用户
  • 现在我看到第二个选项看起来更方便,但这是个好主意吗?这样做难道没有隐藏的不良后果吗?它会对性能产生影响吗?图书馆秘密地这样做是一种好的做法吗

    图书馆秘密地这样做是一种好的做法吗

    我可能忽略了这一点,但对我来说,任何库的意义在于将细节从最终用户那里抽象出来,使使用它变得轻松。当然,抽象可能会在某种程度上限制灵活性,但我觉得这里的情况并非如此。请注意,我只是在讨论“保密性”问题,我真的不知道它对e。G表演

    图书馆作家的最佳实践是什么

    你错过了第三个选择。我通常反对
    init()
    finalize()
    函数,因为这不利于RAII-用户可能会忘记调用这些函数。但是,您可以设计一个仅在应用程序的“根”处创建的“令牌”类,该类是使用API的任何其他部分所必需的。考虑这一点:

    #include <WinSock2.h>
    
    class ApiKey {
    public:
        ApiKey() {
            auto wsadata = WSADATA();
            auto startupResult = WSAStartup(MAKEWORD(2, 2), &wsadata);
            // ...
        }
    
        ~ApiKey() {
            auto cleanupResult = WSACleanup();
            // ...
        }
    };
    
    class Socket {
    public:
        Socket(ApiKey& key) {
        }
        // ...
    };
    
    #包括
    类ApiKey{
    公众:
    ApiKey(){
    自动wsadata=wsadata();
    自动启动结果=WSAStartup(MAKEWORD(2,2)和wsadata);
    // ...
    }
    ~ApiKey(){
    自动清理结果=WSACleanup();
    // ...
    }
    };
    类套接字{
    公众:
    插座(钥匙和钥匙){
    }
    // ...
    };
    
    我不是boost::asio用户,但据我所知,他们就是这样做的。
    io\u上下文
    类用作
    ApiKey

    如果您想了解更多信息,可以在他们的源代码中查找:


    它会影响性能吗?--你认为引用计数会阻止什么?另外,像boost::asio这样的库如何处理这个问题?是的,但它可能仍然会锁定一些互斥锁,因为它希望是线程安全的。Hm,上下文对象。其实这主意不错。