Network
每获取一个网卡信息,都保存为一个Network对象实例。
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\rtc_base\network.h
Network(const std::string& name,const std::string& description,const IPAddress& prefix,int prefix_length);Network(const std::string& name,const std::string& description,const IPAddress& prefix,int prefix_length,AdapterType type);
代码分析
打断点
BasicNetworkManager::StartUpdating
BasicNetworkManager::CreateNetworks
BasicNetworkManager::StartUpdating
void BasicNetworkManager::StartUpdating() {thread_ = Thread::Current();// Redundant but necessary for thread annotations.RTC_DCHECK_RUN_ON(thread_);if (start_count_) {// If network interfaces are already discovered and signal is sent,// we should trigger network signal immediately for the new clients// to start allocating ports.if (sent_first_update_)thread_->Post(RTC_FROM_HERE, this, kSignalNetworksMessage);} else {thread_->Post(RTC_FROM_HERE, this, kUpdateNetworksMessage);StartNetworkMonitor();}++start_count_;}

第一次发送的是kUpdateNetworksMessage信号
BasicNetworkManager::CreateNetworks
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\rtc_base\network.cc
bool BasicNetworkManager::CreateNetworks(bool include_ignored,NetworkList* networks) const {NetworkMap current_networks; //防止重复ip// 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());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 = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());// 同时获取ipv4和ipv6,ret = GetAdaptersAddresses(AF_UNSPEC, adapter_flags, 0, adapter_addrs,reinterpret_cast<PULONG>(&buffer_size));} while (ret == ERROR_BUFFER_OVERFLOW); // 防止内存不足,而使用while循环if (ret != ERROR_SUCCESS) {return false;}int count = 0;while (adapter_addrs) {if (adapter_addrs->OperStatus == IfOperStatusUp) {PIP_ADAPTER_UNICAST_ADDRESS address = adapter_addrs->FirstUnicastAddress;PIP_ADAPTER_PREFIX prefixlist = adapter_addrs->FirstPrefix;std::string name;std::string description;#if !defined(NDEBUG)name = ToUtf8(adapter_addrs->FriendlyName,wcslen(adapter_addrs->FriendlyName));#endifdescription = ToUtf8(adapter_addrs->Description,wcslen(adapter_addrs->Description));for (; address; address = address->Next) {#if defined(NDEBUG)name = rtc::ToString(count);#endifIPAddress ip;int scope_id = 0;std::unique_ptr<Network> network;switch (address->Address.lpSockaddr->sa_family) {case AF_INET: {sockaddr_in* v4_addr =reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr);ip = IPAddress(v4_addr->sin_addr);break;}case AF_INET6: {sockaddr_in6* v6_addr =reinterpret_cast<sockaddr_in6*>(address->Address.lpSockaddr);scope_id = v6_addr->sin6_scope_id;ip = IPAddress(v6_addr->sin6_addr);if (IsIgnoredIPv6(allow_mac_based_ipv6_, InterfaceAddress(ip))) {continue;}break;}default: {continue;}}IPAddress prefix;int prefix_length = GetPrefix(prefixlist, ip, &prefix);std::string key = MakeNetworkKey(name, prefix, prefix_length);auto existing_network = current_networks.find(key);if (existing_network == current_networks.end()) {AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN;switch (adapter_addrs->IfType) {case IF_TYPE_SOFTWARE_LOOPBACK:adapter_type = ADAPTER_TYPE_LOOPBACK;break;case IF_TYPE_ETHERNET_CSMACD:case IF_TYPE_ETHERNET_3MBIT:case IF_TYPE_IEEE80212:case IF_TYPE_FASTETHER:case IF_TYPE_FASTETHER_FX:case IF_TYPE_GIGABITETHERNET: //以太网类型adapter_type = ADAPTER_TYPE_ETHERNET;break;case IF_TYPE_IEEE80211: //wifi类型adapter_type = ADAPTER_TYPE_WIFI;break;case IF_TYPE_WWANPP:case IF_TYPE_WWANPP2: // 蜂窝类型,手机用的adapter_type = ADAPTER_TYPE_CELLULAR;break;default:// TODO(phoglund): Need to recognize other types as well.adapter_type = ADAPTER_TYPE_UNKNOWN;break;}std::unique_ptr<Network> network(new Network(name, description, prefix, prefix_length, adapter_type));network->set_default_local_address_provider(this);network->set_mdns_responder_provider(this);network->set_scope_id(scope_id);network->AddIP(ip);bool ignored = IsIgnoredNetwork(*network);network->set_ignored(ignored);if (include_ignored || !network->ignored()) {current_networks[key] = network.get();networks->push_back(network.release());}} else {(*existing_network).second->AddIP(ip);}}// Count is per-adapter - all 'Networks' created from the same// adapter need to have the same name.++count;}adapter_addrs = adapter_addrs->Next;}return true;}

这时候的是
NetworkMap current_networks; //防止重复ip
获取到网卡信息后,下面使用while循环遍历。
