本文主要是介绍asio之winsock的初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简介
asio中,winsock初始化工作是放在winsock_init类中来处理的
类结构
winsock_init_base:提供了静态方法startup和cleanup,其中startup主要是调用WSAStartup,内部保证只调用一次,cleanup是调用WSACleanup,只有在data的init_count_为0时,才会调用WSACleanup
void winsock_init_base::startup(data& d,unsigned char major, unsigned char minor)
{if (::InterlockedIncrement(&d.init_count_) == 1){WSADATA wsa_data;long result = ::WSAStartup(MAKEWORD(major, minor), &wsa_data);::InterlockedExchange(&d.result_, result);}
}void winsock_init_base::cleanup(data& d)
{if (::InterlockedDecrement(&d.init_count_) == 0){::WSACleanup();}
}
winsock_init:是模板类,其有两个非类型模板参数,表示winsock库的major,minor版本,其私有继承winsock_init_base
template <int Major = 2, int Minor = 0>
class winsock_init : private winsock_init_base
{
public:winsock_init(bool allow_throw = true){startup(data_, Major, Minor);if (allow_throw)throw_on_error(data_);}winsock_init(const winsock_init&){startup(data_, Major, Minor);throw_on_error(data_);}~winsock_init(){cleanup(data_);}
};
这篇关于asio之winsock的初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!