| 565 | } |
| 566 | |
| 567 | IPAddress::LocalAddresses::LocalAddresses() { |
| 568 | |
| 569 | #if defined (WIN32) |
| 570 | ULONG size = MAX_ADAPTERS_SIZE; |
| 571 | Buffer buffer(MAX_ADAPTERS_SIZE); |
| 572 | PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *)buffer.data(), adapt = NULL; |
| 573 | PIP_ADAPTER_UNICAST_ADDRESS aip = NULL; |
| 574 | |
| 575 | if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &size) != NO_ERROR) { |
| 576 | emplace_back(Loopback(IPAddress::IPv4)); |
| 577 | return; |
| 578 | } |
| 579 | |
| 580 | for (adapt = pAddresses; adapt; adapt = adapt->Next) { |
| 581 | for (aip = adapt->FirstUnicastAddress; aip; aip = aip->Next) { |
| 582 | |
| 583 | if (aip->Address.lpSockaddr->sa_family == AF_INET6) |
| 584 | emplace_back(reinterpret_cast<struct sockaddr_in6*>(aip->Address.lpSockaddr)->sin6_addr, reinterpret_cast<struct sockaddr_in6*>(aip->Address.lpSockaddr)->sin6_scope_id); |
| 585 | else if (aip->Address.lpSockaddr->sa_family == AF_INET) |
| 586 | emplace_back(reinterpret_cast<struct sockaddr_in*>(aip->Address.lpSockaddr)->sin_addr); |
| 587 | } |
| 588 | } |
| 589 | #else |
| 590 | struct ifaddrs * ifAddrStruct = NULL; |
| 591 | if (getifaddrs(&ifAddrStruct) == -1) { |
| 592 | emplace_back(Loopback(IPAddress::IPv4)); |
| 593 | return; |
| 594 | } |
| 595 | |
| 596 | for (struct ifaddrs * ifa = ifAddrStruct; ifa; ifa = ifa->ifa_next) { |
| 597 | |
| 598 | if (ifa->ifa_addr->sa_family == AF_INET6) |
| 599 | emplace_back(reinterpret_cast<struct sockaddr_in6*>(ifa->ifa_addr)->sin6_addr, reinterpret_cast<struct sockaddr_in6*>(ifa->ifa_addr)->sin6_scope_id); |
| 600 | else if (ifa->ifa_addr->sa_family == AF_INET) |
| 601 | emplace_back(reinterpret_cast<struct sockaddr_in*>(ifa->ifa_addr)->sin_addr); |
| 602 | } |
| 603 | #endif |
| 604 | } |
| 605 | |
| 606 | } // namespace Mona |