Browse Source

Added android broadcast address support

tags/2021-05-28
jules 7 years ago
parent
commit
a2fcd9b4c1
2 changed files with 53 additions and 29 deletions
  1. +52
    -28
      modules/juce_core/native/juce_android_Network.cpp
  2. +1
    -1
      modules/juce_core/native/juce_mac_linux_IPAddress.h

+ 52
- 28
modules/juce_core/native/juce_android_Network.cpp View File

@@ -342,15 +342,20 @@ URL::DownloadTask* URL::downloadToFile (const File& targetLocation, String extra
}
//==============================================================================
static void addAddress (const sockaddr_in* addr_in, Array<IPAddress>& 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<IPAddress>& result)
struct InterfaceInfo
{
IPAddress interfaceAddress, broadcastAddress;
};
static Array<InterfaceInfo> findIPAddresses (int dummySocket)
{
ifconf cfg;
HeapBlock<char> buffer;
@@ -364,45 +369,64 @@ static void findIPAddresses (int sock, Array<IPAddress>& 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<InterfaceInfo> 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<IPAddress>& result, bool /*includeIPv6*/)
static Array<InterfaceInfo> 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<IPAddress>& 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 {};
}


+ 1
- 1
modules/juce_core/native/juce_mac_linux_IPAddress.h View File

@@ -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 {};


Loading…
Cancel
Save