30 IPAddress interfaceAddress, broadcastAddress;
33 inline bool operator== (
const InterfaceInfo& lhs,
const InterfaceInfo& rhs)
35 return lhs.interfaceAddress == rhs.interfaceAddress
36 && lhs.broadcastAddress == rhs.broadcastAddress;
40 static IPAddress makeAddress (
const sockaddr_in6* addr_in)
42 if (addr_in ==
nullptr)
45 auto addr = addr_in->sin6_addr;
47 IPAddressByteUnion temp;
50 for (
int i = 0; i < 8; ++i)
52 temp.split[0] = addr.s6_addr[i * 2 + 1];
53 temp.split[1] = addr.s6_addr[i * 2];
55 arr[i] = temp.combined;
58 return IPAddress (arr);
61 static IPAddress makeAddress (
const sockaddr_in* addr_in)
63 if (addr_in->sin_addr.s_addr == INADDR_NONE)
66 return IPAddress (ntohl (addr_in->sin_addr.s_addr));
69 bool populateInterfaceInfo (
struct ifaddrs* ifa, InterfaceInfo& interfaceInfo)
71 if (ifa->ifa_addr !=
nullptr)
73 if (ifa->ifa_addr->sa_family == AF_INET)
75 auto interfaceAddressInfo = unalignedPointerCast<sockaddr_in*> (ifa->ifa_addr);
76 auto broadcastAddressInfo = unalignedPointerCast<sockaddr_in*> (ifa->ifa_dstaddr);
78 if (interfaceAddressInfo->sin_addr.s_addr != INADDR_NONE)
80 interfaceInfo.interfaceAddress = makeAddress (interfaceAddressInfo);
81 interfaceInfo.broadcastAddress = makeAddress (broadcastAddressInfo);
85 else if (ifa->ifa_addr->sa_family == AF_INET6)
87 interfaceInfo.interfaceAddress = makeAddress (unalignedPointerCast<sockaddr_in6*> (ifa->ifa_addr));
88 interfaceInfo.broadcastAddress = makeAddress (unalignedPointerCast<sockaddr_in6*> (ifa->ifa_dstaddr));
97 Array<InterfaceInfo> getAllInterfaceInfo()
99 Array<InterfaceInfo> interfaces;
104 struct ifaddrs* ifaddr =
nullptr;
106 if (getifaddrs (&ifaddr) != -1)
108 for (
auto* ifa = ifaddr; ifa !=
nullptr; ifa = ifa->ifa_next)
112 if (populateInterfaceInfo (ifa, i))
113 interfaces.addIfNotAlreadyThere (i);
116 freeifaddrs (ifaddr);
126 for (
auto& i : getAllInterfaceInfo())
127 if (includeIPv6 || ! i.interfaceAddress.isIPv6)
133 for (
auto& i : getAllInterfaceInfo())
134 if (i.interfaceAddress == interfaceAddress)
135 return i.broadcastAddress;
Holds a resizable array of primitive or copy-by-value objects.
bool addIfNotAlreadyThere(ParameterType newElement)
Appends a new element at the end of the array as long as the array doesn't already contain it.
Represents an IP address.
static IPAddress getInterfaceBroadcastAddress(const IPAddress &interfaceAddress)
If the IPAdress is the address of an interface on the machine, returns the associated broadcast addre...
static void findAllAddresses(Array< IPAddress > &results, bool includeIPv6=false)
Populates a list of all the IP addresses that this machine is using.
unsigned short uint16
A platform-independent 16-bit unsigned integer type.