MCPcopy Create free account
hub / github.com/MeisApps/pcbu-desktop / GetLocalNetInterfaces

Method GetLocalNetInterfaces

common/src/platform/NetworkHelper.cpp:37–157  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

35 R"((^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.1[6-9]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.2[0-9]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^172\.3[0-1]{1}[0-9]{0,1}\.[0-9]{1,3}\.[0-9]{1,3}$)|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$))");
36
37std::vector<NetworkInterface> NetworkHelper::GetLocalNetInterfaces() {
38 std::vector<NetworkInterface> result{};
39#ifdef WINDOWS
40 ULONG bufferSize = 0;
41 GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS, nullptr, nullptr, &bufferSize);
42 std::vector<BYTE> buffer(bufferSize);
43 auto adapterAddresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());
44 if(GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS, nullptr, adapterAddresses, &bufferSize))
45 return {};
46
47 for(PIP_ADAPTER_ADDRESSES adapter = adapterAddresses; adapter; adapter = adapter->Next) {
48 if(adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK || adapter->OperStatus != IfOperStatusUp)
49 continue;
50
51 char macBuffer[18]{};
52 snprintf(macBuffer, sizeof(macBuffer), "%02X:%02X:%02X:%02X:%02X:%02X", adapter->PhysicalAddress[0], adapter->PhysicalAddress[1],
53 adapter->PhysicalAddress[2], adapter->PhysicalAddress[3], adapter->PhysicalAddress[4], adapter->PhysicalAddress[5]);
54 auto ifName = std::wstring(adapter->FriendlyName);
55 auto macAddr = std::string(macBuffer);
56
57 auto netIf = NetworkInterface();
58 netIf.ifName = StringUtils::FromWideString(ifName);
59 netIf.macAddress = macAddr;
60 for(PIP_ADAPTER_UNICAST_ADDRESS unicast = adapter->FirstUnicastAddress; unicast; unicast = unicast->Next) {
61 auto family = unicast->Address.lpSockaddr->sa_family;
62 if(family != AF_INET)
63 continue;
64 auto ipv4 = reinterpret_cast<SOCKADDR_IN *>(unicast->Address.lpSockaddr);
65 char strBuffer[INET_ADDRSTRLEN]{};
66 inet_ntop(AF_INET, &(ipv4->sin_addr), strBuffer, INET_ADDRSTRLEN);
67 auto ifAddr = std::string(strBuffer);
68 netIf.ipAddress = ifAddr;
69 }
70 for(PIP_ADAPTER_GATEWAY_ADDRESS gateway = adapter->FirstGatewayAddress; gateway; gateway = gateway->Next) {
71 auto family = gateway->Address.lpSockaddr->sa_family;
72 if(family != AF_INET)
73 continue;
74 auto ipv4 = reinterpret_cast<SOCKADDR_IN *>(gateway->Address.lpSockaddr);
75 char strBuffer[INET_ADDRSTRLEN]{};
76 inet_ntop(AF_INET, &(ipv4->sin_addr), strBuffer, INET_ADDRSTRLEN);
77 auto ifAddr = std::string(strBuffer);
78 netIf.gateway = ifAddr;
79 }
80 if(!netIf.ipAddress.empty())
81 result.emplace_back(netIf);
82 }
83#elif defined(LINUX) || defined(APPLE)
84 struct ifaddrs *ifaddr{};
85 if(getifaddrs(&ifaddr))
86 return {};
87
88 std::map<std::string, NetworkInterface> ifMap{};
89 for(auto ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) {
90 if(ifa->ifa_addr == nullptr || ifa->ifa_flags & IFF_LOOPBACK || !(ifa->ifa_flags & IFF_UP))
91 continue;
92 int family = ifa->ifa_addr->sa_family;
93 if(family == AF_INET || family == AF_PACKET) {
94 char addr[NI_MAXHOST]{};

Callers

nothing calls this directly

Calls 2

NetworkInterfaceClass · 0.85
dataMethod · 0.45

Tested by

no test coverage detected