Network

每获取一个网卡信息,都保存为一个Network对象实例。
image.png
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\rtc_base\network.h

  1. Network(const std::string& name,
  2. const std::string& description,
  3. const IPAddress& prefix,
  4. int prefix_length);
  5. Network(const std::string& name,
  6. const std::string& description,
  7. const IPAddress& prefix,
  8. int prefix_length,
  9. AdapterType type);

代码分析

打断点
BasicNetworkManager::StartUpdating
BasicNetworkManager::CreateNetworks

BasicNetworkManager::StartUpdating

  1. void BasicNetworkManager::StartUpdating() {
  2. thread_ = Thread::Current();
  3. // Redundant but necessary for thread annotations.
  4. RTC_DCHECK_RUN_ON(thread_);
  5. if (start_count_) {
  6. // If network interfaces are already discovered and signal is sent,
  7. // we should trigger network signal immediately for the new clients
  8. // to start allocating ports.
  9. if (sent_first_update_)
  10. thread_->Post(RTC_FROM_HERE, this, kSignalNetworksMessage);
  11. } else {
  12. thread_->Post(RTC_FROM_HERE, this, kUpdateNetworksMessage);
  13. StartNetworkMonitor();
  14. }
  15. ++start_count_;
  16. }

image.png
第一次发送的是kUpdateNetworksMessage信号

BasicNetworkManager::CreateNetworks

H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\rtc_base\network.cc

  1. bool BasicNetworkManager::CreateNetworks(bool include_ignored,
  2. NetworkList* networks) const {
  3. NetworkMap current_networks; //防止重复ip
  4. // MSDN recommends a 15KB buffer for the first try at GetAdaptersAddresses.
  5. size_t buffer_size = 16384;
  6. std::unique_ptr<char[]> adapter_info(new char[buffer_size]);
  7. PIP_ADAPTER_ADDRESSES adapter_addrs =
  8. reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());
  9. int adapter_flags = (GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST |
  10. GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_INCLUDE_PREFIX);
  11. int ret = 0;
  12. do { // 一般循环一次而已
  13. adapter_info.reset(new char[buffer_size]);
  14. adapter_addrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());
  15. // 同时获取ipv4和ipv6,
  16. ret = GetAdaptersAddresses(AF_UNSPEC, adapter_flags, 0, adapter_addrs,
  17. reinterpret_cast<PULONG>(&buffer_size));
  18. } while (ret == ERROR_BUFFER_OVERFLOW); // 防止内存不足,而使用while循环
  19. if (ret != ERROR_SUCCESS) {
  20. return false;
  21. }
  22. int count = 0;
  23. while (adapter_addrs) {
  24. if (adapter_addrs->OperStatus == IfOperStatusUp) {
  25. PIP_ADAPTER_UNICAST_ADDRESS address = adapter_addrs->FirstUnicastAddress;
  26. PIP_ADAPTER_PREFIX prefixlist = adapter_addrs->FirstPrefix;
  27. std::string name;
  28. std::string description;
  29. #if !defined(NDEBUG)
  30. name = ToUtf8(adapter_addrs->FriendlyName,
  31. wcslen(adapter_addrs->FriendlyName));
  32. #endif
  33. description = ToUtf8(adapter_addrs->Description,
  34. wcslen(adapter_addrs->Description));
  35. for (; address; address = address->Next) {
  36. #if defined(NDEBUG)
  37. name = rtc::ToString(count);
  38. #endif
  39. IPAddress ip;
  40. int scope_id = 0;
  41. std::unique_ptr<Network> network;
  42. switch (address->Address.lpSockaddr->sa_family) {
  43. case AF_INET: {
  44. sockaddr_in* v4_addr =
  45. reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr);
  46. ip = IPAddress(v4_addr->sin_addr);
  47. break;
  48. }
  49. case AF_INET6: {
  50. sockaddr_in6* v6_addr =
  51. reinterpret_cast<sockaddr_in6*>(address->Address.lpSockaddr);
  52. scope_id = v6_addr->sin6_scope_id;
  53. ip = IPAddress(v6_addr->sin6_addr);
  54. if (IsIgnoredIPv6(allow_mac_based_ipv6_, InterfaceAddress(ip))) {
  55. continue;
  56. }
  57. break;
  58. }
  59. default: {
  60. continue;
  61. }
  62. }
  63. IPAddress prefix;
  64. int prefix_length = GetPrefix(prefixlist, ip, &prefix);
  65. std::string key = MakeNetworkKey(name, prefix, prefix_length);
  66. auto existing_network = current_networks.find(key);
  67. if (existing_network == current_networks.end()) {
  68. AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN;
  69. switch (adapter_addrs->IfType) {
  70. case IF_TYPE_SOFTWARE_LOOPBACK:
  71. adapter_type = ADAPTER_TYPE_LOOPBACK;
  72. break;
  73. case IF_TYPE_ETHERNET_CSMACD:
  74. case IF_TYPE_ETHERNET_3MBIT:
  75. case IF_TYPE_IEEE80212:
  76. case IF_TYPE_FASTETHER:
  77. case IF_TYPE_FASTETHER_FX:
  78. case IF_TYPE_GIGABITETHERNET: //以太网类型
  79. adapter_type = ADAPTER_TYPE_ETHERNET;
  80. break;
  81. case IF_TYPE_IEEE80211: //wifi类型
  82. adapter_type = ADAPTER_TYPE_WIFI;
  83. break;
  84. case IF_TYPE_WWANPP:
  85. case IF_TYPE_WWANPP2: // 蜂窝类型,手机用的
  86. adapter_type = ADAPTER_TYPE_CELLULAR;
  87. break;
  88. default:
  89. // TODO(phoglund): Need to recognize other types as well.
  90. adapter_type = ADAPTER_TYPE_UNKNOWN;
  91. break;
  92. }
  93. std::unique_ptr<Network> network(new Network(
  94. name, description, prefix, prefix_length, adapter_type));
  95. network->set_default_local_address_provider(this);
  96. network->set_mdns_responder_provider(this);
  97. network->set_scope_id(scope_id);
  98. network->AddIP(ip);
  99. bool ignored = IsIgnoredNetwork(*network);
  100. network->set_ignored(ignored);
  101. if (include_ignored || !network->ignored()) {
  102. current_networks[key] = network.get();
  103. networks->push_back(network.release());
  104. }
  105. } else {
  106. (*existing_network).second->AddIP(ip);
  107. }
  108. }
  109. // Count is per-adapter - all 'Networks' created from the same
  110. // adapter need to have the same name.
  111. ++count;
  112. }
  113. adapter_addrs = adapter_addrs->Next;
  114. }
  115. return true;
  116. }

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