18 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
23 #pragma comment(lib, "IPHLPAPI.lib")
24 #pragma comment(lib, "Ws2_32.lib")
27 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
28 defined(__bsdi__) || defined(__DragonFly__)
29 #include <sys/socket.h>
30 #include <netinet/in.h>
32 #include <arpa/inet.h>
38 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
39 using IF_ADDRS = PIP_ADAPTER_ADDRESSES;
44 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
51 #pragma GCC diagnostic push
52 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
63 #if defined(__MINGW32__)
64 char addr_str[NI_MAXHOST];
65 if (getnameinfo(addr, sa_len, addr_str, NI_MAXHOST, 0, 0, NI_NUMERICHOST) != 0) {
70 int family = addr->sa_family;
71 char addr_str[INET6_ADDRSTRLEN];
72 void* src_addr =
nullptr;
75 src_addr = &(
reinterpret_cast<struct sockaddr_in*
>(addr)->sin_addr);
78 src_addr = &(
reinterpret_cast<struct sockaddr_in6*
>(addr)->sin6_addr);
83 inet_ntop(family, src_addr, addr_str, INET6_ADDRSTRLEN);
86 return std::string(addr_str);
90 #pragma GCC diagnostic pop
99 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
100 HeapFree(GetProcessHeap(), 0, addrs);
117 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
121 ULONG bufLen = 15000;
124 *addrs = (IP_ADAPTER_ADDRESSES*)HeapAlloc(GetProcessHeap(), 0, bufLen);
125 if (*addrs == NULL) {
129 rv = GetAdaptersAddresses(family, GAA_FLAG_INCLUDE_PREFIX, NULL, *addrs, &bufLen);
130 if (rv == ERROR_BUFFER_OVERFLOW) {
138 }
while ((rv == ERROR_BUFFER_OVERFLOW) && (iter < 3));
139 if (rv != NO_ERROR) {
146 return getifaddrs(addrs);
157 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
158 return addr->Address.lpSockaddr;
160 return addr->ifa_addr;
171 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
172 return addr->Address.iSockaddrLength;
174 return sizeof(*addr->ifa_addr);
188 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
192 auto next = addrs->ifa_next;
193 while (next != NULL) {
196 if (next_sockaddr == NULL) {
197 next = next->ifa_next;
201 int next_family = next_sockaddr->sa_family;
203 if (next_family != AF_INET && next_family != AF_INET6) {
204 next = next->ifa_next;
208 if ((family == AF_INET || family == AF_INET6) && family != next_family) {
209 next = next->ifa_next;
228 std::vector<std::string> result_list;
234 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
236 if (WSAStartup(0x202, &wsaData) != 0) {
239 auto winAddrs = allAddrs;
241 auto addrs = winAddrs->FirstUnicastAddress;
243 auto addrs = allAddrs;
248 if (!ipAddr.empty()) {
249 result_list.push_back(ipAddr);
253 #if defined(_WIN32) || defined(__USE_W32_SOCKETS)
254 winAddrs = winAddrs->Next;
struct ifaddrs * IF_ADDRS
auto getAddresses(int family, IF_ADDRS *addrs)
std::string addressToString(struct sockaddr *addr, int sa_len)
auto getSockAddr(IF_ADDRS_UNICAST addr)
std::vector< std::string > getInterfaceAddressesAll()
struct ifaddrs * IF_ADDRS_UNICAST
void freeAddresses(IF_ADDRS addrs)
std::vector< std::string > getInterfaceAddressesV4()
std::vector< std::string > getInterfaceAddresses(int family)
int getSockAddrLen(IF_ADDRS_UNICAST addr)
IF_ADDRS_UNICAST getNextAddress(int family, IF_ADDRS_UNICAST addrs)
std::vector< std::string > getInterfaceAddressesV6()