1#if !defined( EMSCRIPTEN )
5#include "../Logging/Logger.h"
6#include "../Platform/Unicode.h"
11#pragma comment(lib, "IPHLPAPI.lib")
26namespace Cogs::Network{
28static std::vector<NetworkAdapter> adapters;
30void UpdateAdapters(AdapterFlags adapter_flags)
33 if(adapter_flags & AdapterFlags::IncludeAny)
34 adapters.push_back({
"Any", AddrIn(0, 0, 0, 0), AddrIn(255, 255, 255, 255), AddrIn(0, 0, 0, 0)});
35 if(adapter_flags & AdapterFlags::IncludeLocalhost)
36 adapters.push_back({
"Localhost", AddrIn(127, 0, 0, 1), AddrIn(255, 0, 0, 0), AddrIn(127, 255, 255, 255)});
38 ULONG family = AF_INET;
40 ULONG bufferSize = 16384;
41 std::vector<char> buffer(bufferSize);
42 ULONG ret = GetAdaptersAddresses(family, flags,
nullptr,
reinterpret_cast<IP_ADAPTER_ADDRESSES*
>(buffer.data()), &bufferSize);
44 if (ret == ERROR_BUFFER_OVERFLOW) {
45 buffer.resize(bufferSize);
46 ret = GetAdaptersAddresses(family, flags,
nullptr,
reinterpret_cast<IP_ADAPTER_ADDRESSES*
>(buffer.data()), &bufferSize);
48 if (ret == ERROR_SUCCESS) {
49 IP_ADAPTER_ADDRESSES* ptr =
reinterpret_cast<IP_ADAPTER_ADDRESSES*
>(buffer.data());
52 if((ptr->IfType != IF_TYPE_ETHERNET_CSMACD) &&
53 (ptr->IfType != IF_TYPE_IEEE80211)){
58 adapters.push_back({});
59 NetworkAdapter &adapter = adapters.back();
60 adapter.name = narrow(ptr->FriendlyName);
62 PIP_ADAPTER_UNICAST_ADDRESS pUnicast = ptr->FirstUnicastAddress;
64 sockaddr_in *addr =
reinterpret_cast<sockaddr_in*
>(pUnicast->Address.lpSockaddr);
65 assert(addr->sin_family == AF_INET);
66 adapter.addr = AddrIn(addr->sin_addr);
69 ConvertLengthToIpv4Mask(pUnicast->OnLinkPrefixLength, &mask);
70 adapter.mask.addr.s_addr = mask;
71 adapter.broadcast.addr.s_addr = addr->sin_addr.s_addr | ~mask;
78 LOG_DEBUG(logger,
"UpdateAdapters(): GetAdaptersAddresses failed with %08x error code.", ret);
82 struct ifaddrs *ifa =
nullptr;
83 int ret = getifaddrs(&ifa);
89 struct ifaddrs *next = ifa;
90 for(; next; next = next->ifa_next){
91 if(next->ifa_addr && next->ifa_addr->sa_family == AF_INET){
92 sockaddr_in *addr =
reinterpret_cast<sockaddr_in*
>(next->ifa_addr);
93 sockaddr_in *mask =
reinterpret_cast<sockaddr_in*
>(next->ifa_netmask);
94#if defined( __APPLE__ )
95 sockaddr_in *broadcast =
reinterpret_cast<sockaddr_in*
>(next->ifa_dstaddr);
97 sockaddr_in *broadcast =
reinterpret_cast<sockaddr_in*
>(next->ifa_ifu.ifu_broadaddr);
100 adapters.push_back({});
101 NetworkAdapter &adapter = adapters.back();
102 adapter.name = next->ifa_name;
103 adapter.addr = AddrIn(addr->sin_addr);
104 adapter.mask = AddrIn(mask->sin_addr);
105 adapter.broadcast = AddrIn(broadcast->sin_addr);
114 LOG_INFO(logger,
"Adapters(%zu):", adapters.size());
115 for(
auto &adapter : adapters){
116 LOG_INFO(logger,
"%s: ip %s (mask %s) (broadcast %s)",
117 adapter.name.c_str(),
118 adapter.addr.string().c_str(),
119 adapter.mask.string().c_str(),
120 adapter.broadcast.string().c_str());
123NetworkAdapter GetAdapter(
size_t i)
127size_t GetAdapterCount()
129 return adapters.size();
132int FindAdapter(
const AddrIn& address) {
133 for (
int idx = 0, count =
static_cast<int>(adapters.size()); idx < count; ++idx) {
134 if (adapters[idx].addr == address) {
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept