C++ 在网络库中初始化Winsock的最佳实践
我正在编写一个小型库,它在内部使用OS socket API进行一些联网 在Windows上,需要在开始时调用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,并指示用户在应用程序开始/结束时
WSAStartup
,在结束时调用WSACleanup
来初始化Winsock。但是,它说它可以多次初始化Winsock,然后清除相同次数的内容,因为它在内部使用引用计数
现在我正在解决一个难题。图书馆作家的最佳实践是什么
initializeLibrary
/terminateLibrary
,该函数调用WSAStartup
/WSACleanup
,并指示用户在应用程序开始/结束时调用它们WSAStartup
/WSACleanup
,根本不必麻烦用户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,上下文对象。其实这主意不错。