From a2fcd9b4c1da211e29a49da076809a6c8f200dcb Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 23 Oct 2018 14:59:53 +0100 Subject: [PATCH] Added android broadcast address support --- .../juce_core/native/juce_android_Network.cpp | 80 ++++++++++++------- .../native/juce_mac_linux_IPAddress.h | 2 +- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/modules/juce_core/native/juce_android_Network.cpp b/modules/juce_core/native/juce_android_Network.cpp index 99a0bee8d5..ba85fc54d6 100644 --- a/modules/juce_core/native/juce_android_Network.cpp +++ b/modules/juce_core/native/juce_android_Network.cpp @@ -342,15 +342,20 @@ URL::DownloadTask* URL::downloadToFile (const File& targetLocation, String extra } //============================================================================== -static void addAddress (const sockaddr_in* addr_in, Array& result) +static IPAddress makeAddress (const sockaddr_in *addr_in) { - in_addr_t addr = addr_in->sin_addr.s_addr; + if (addr_in->sin_addr.s_addr == INADDR_NONE) + return {}; - if (addr != INADDR_NONE) - result.addIfNotAlreadyThere (IPAddress (ntohl (addr))); + return IPAddress (ntohl (addr_in->sin_addr.s_addr)); } -static void findIPAddresses (int sock, Array& result) +struct InterfaceInfo +{ + IPAddress interfaceAddress, broadcastAddress; +}; + +static Array findIPAddresses (int dummySocket) { ifconf cfg; HeapBlock buffer; @@ -364,45 +369,64 @@ static void findIPAddresses (int sock, Array& result) cfg.ifc_len = bufferSize; cfg.ifc_buf = buffer; - if (ioctl (sock, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL) - return; + if (ioctl (dummySocket, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL) + return {}; } while (bufferSize < cfg.ifc_len + 2 * (int) (IFNAMSIZ + sizeof (struct sockaddr_in6))); - #if JUCE_MAC || JUCE_IOS - while (cfg.ifc_len >= (int) (IFNAMSIZ + sizeof (struct sockaddr_in))) - { - if (cfg.ifc_req->ifr_addr.sa_family == AF_INET) // Skip non-internet addresses - addAddress ((const sockaddr_in*) &cfg.ifc_req->ifr_addr, result); + Array result; - cfg.ifc_len -= IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; - cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; - } - #else for (size_t i = 0; i < (size_t) cfg.ifc_len / (size_t) sizeof (struct ifreq); ++i) { - const ifreq& item = cfg.ifc_req[i]; + auto& item = cfg.ifc_req[i]; if (item.ifr_addr.sa_family == AF_INET) - addAddress ((const sockaddr_in*) &item.ifr_addr, result); + { + InterfaceInfo i; + i.interfaceAddress = makeAddress ((const sockaddr_in*) &item.ifr_addr); + + if (! i.interfaceAddress.isNull()) + { + if (ioctl (dummySocket, SIOCGIFBRDADDR, &item) == 0) + i.broadcastAddress = makeAddress ((const sockaddr_in*) &item.ifr_broadaddr); + + result.add (i); + } + } + else if (item.ifr_addr.sa_family == AF_INET6) + { + // TODO: IPv6 + } } - #endif + + return result; } -void IPAddress::findAllAddresses (Array& result, bool /*includeIPv6*/) +static Array findIPAddresses() { - const int sock = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control + auto dummySocket = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control - if (sock >= 0) - { - findIPAddresses (sock, result); - ::close (sock); - } + if (dummySocket < 0) + return {}; + + auto result = findIPAddresses (dummySocket); + ::close (dummySocket); + return result; +} + +void IPAddress::findAllAddresses (Array& result, bool /*includeIPv6*/) +{ + for (auto& a : findIPAddresses()) + result.add (a.interfaceAddress); } -IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress&) +IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress& address) { - return {}; // TODO + for (auto& a : findIPAddresses()) + if (a.interfaceAddress == address) + return a.broadcastAddress; + + return {}; } diff --git a/modules/juce_core/native/juce_mac_linux_IPAddress.h b/modules/juce_core/native/juce_mac_linux_IPAddress.h index ecec568e74..f063f50099 100644 --- a/modules/juce_core/native/juce_mac_linux_IPAddress.h +++ b/modules/juce_core/native/juce_mac_linux_IPAddress.h @@ -46,7 +46,7 @@ namespace return IPAddress (arr); } - static IPAddress makeAddress (const sockaddr_in *addr_in) + static IPAddress makeAddress (const sockaddr_in* addr_in) { if (addr_in->sin_addr.s_addr == INADDR_NONE) return {};