network 支持功能
1、本地网络
2、适配器
3、dns
4、网络的开销
获取本机的网络
1、调用 GetAdaptersAddresses函数检索与本地计算机上的适配器关联的地址。
2、遍历适配器信息
- 2.1 判断操作状态,如果是启动才进行处理
-
bool BasicNetworkManager::CreateNetworks(bool include_ignored,
NetworkList* networks) const {
NetworkMap current_networks;
// MSDN recommends a 15KB buffer for the first try at GetAdaptersAddresses.
size_t buffer_size = 16384;
std::unique_ptr<char[]> adapter_info(new char[buffer_size]);
PIP_ADAPTER_ADDRESSES adapter_addrs =
reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());
// 1. 获取适配器的信息,存放到adapter_info中,如果存储不下,重新分配内存适应
int adapter_flags = (GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST |
GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_INCLUDE_PREFIX);
int ret = 0;
do {
adapter_info.reset(new char[buffer_size]);
//adapter_addrs 指向缓冲区的指针,该缓冲区包含成功返回时IP_ADAPTER_ADDRESSES结构的链表。
adapter_addrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());
ret = GetAdaptersAddresses(AF_UNSPEC, adapter_flags, 0, adapter_addrs,
reinterpret_cast<PULONG>(&buffer_size));
} while (ret == ERROR_BUFFER_OVERFLOW);
if (ret != ERROR_SUCCESS) {
return false;
}
// 2. 遍历适配器信息,
int count = 0;
while (adapter_addrs) {
// 2.1 判断操作状态,如果是启动才进行处理
if (adapter_addrs->OperStatus == IfOperStatusUp) {
// 2.1.1 第一个单播地址指针
PIP_ADAPTER_UNICAST_ADDRESS address = adapter_addrs->FirstUnicastAddress;
PIP_ADAPTER_PREFIX prefixlist = adapter_addrs->FirstPrefix;
// 2.1.2 获取适配器名称和描述
std::string name;
std::string description;
#if !defined(NDEBUG)
name = ToUtf8(adapter_addrs->FriendlyName,
wcslen(adapter_addrs->FriendlyName));
#endif
description = ToUtf8(adapter_addrs->Description,
wcslen(adapter_addrs->Description))