Hi!
Here an implementation proposal for missing IPAddress::getInterfaceBroadcastAddress on Win32.
This now only support ipv4.
Hopping this can helps:
struct ConvertLengthToIpv4MaskHelper
{
bool callConvertLengthToIpv4Mask(ULONG maskLength)
{
DynamicLibrary dll("iphlpapi.dll");
JUCE_LOAD_WINAPI_FUNCTION(dll, ConvertLengthToIpv4Mask, convertLengthToIpv4Mask, NETIO_STATUS, (ULONG, PULONG))
if (convertLengthToIpv4Mask == nullptr)
return false;
return convertLengthToIpv4Mask(maskLength, &mask) == NO_ERROR;
}
ULONG mask;
};
IPAddress IPAddress::getInterfaceBroadcastAddress (const IPAddress& interfaceAddress)
{
if (interfaceAddress == IPAddress()) // null ip address (0.0.0.0, 0:0:0:0:0:0:0:0 or ::)
return broadcast(); // return broadcast for any interface
if (interfaceAddress == local(false))
return local(false);
if (interfaceAddress == local(true))
return local(true);
// TODO IPv6
GetAdaptersAddressesHelper addressesHelper;
if (addressesHelper.callGetAdaptersAddresses())
{
for (PIP_ADAPTER_ADDRESSES adapter = addressesHelper.adaptersAddresses; adapter != nullptr; adapter = adapter->Next)
{
for (auto addr = adapter->FirstUnicastAddress; addr != nullptr; addr = addr->Next)
{
if (addr->Address.lpSockaddr->sa_family == AF_INET && MACAddressHelpers::createAddress((sockaddr_in*)addr->Address.lpSockaddr) == interfaceAddress)
{
ConvertLengthToIpv4MaskHelper convertLengthToIpv4MaskHelper;
if (convertLengthToIpv4MaskHelper.callConvertLengthToIpv4Mask(addr->OnLinkPrefixLength))
{
ULONG mask = ~convertLengthToIpv4MaskHelper.mask;
IPAddress maskIp = IPAddress(reinterpret_cast<const juce::uint8* >(&mask));
IPAddress res = interfaceAddress;
for (size_t i = 0; i < 4; ++i)
res.address[i] |= maskIp.address[i];
return res;
}
}
}
}
}
return {};
}


