10#include "../../stdafx.h"
11#include "../../debug.h"
14#include "../../safeguards.h"
26 SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
27 if (sock == INVALID_SOCKET)
return;
29 std::vector<INTERFACE_INFO> ifos;
34 if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST,
nullptr, 0, ifos.data(),
static_cast<DWORD
>(ifos.size() *
sizeof(INTERFACE_INFO)), &len,
nullptr,
nullptr) == 0) {
35 ifos.resize(len /
sizeof(INTERFACE_INFO));
38 if (WSAGetLastError() != WSAEFAULT) {
42 ifos.resize(ifos.size() * 2);
45 for (
auto &ifo : ifos) {
46 if (ifo.iiFlags & IFF_LOOPBACK)
continue;
47 if (!(ifo.iiFlags & IFF_BROADCAST))
continue;
49 sockaddr_storage address{};
51 memcpy(&address, &ifo.iiAddress.Address,
sizeof(sockaddr));
52 reinterpret_cast<sockaddr_in*
>(&address)->sin_addr.s_addr = ifo.iiAddress.AddressIn.sin_addr.s_addr | ~ifo.iiNetmask.AddressIn.sin_addr.s_addr;
54 if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](
NetworkAddress const &elem) ->
bool { return elem == addr; })) broadcast->push_back(addr);
63 struct ifaddrs *ifap, *ifa;
65 if (getifaddrs(&ifap) != 0)
return;
67 for (ifa = ifap; ifa !=
nullptr; ifa = ifa->ifa_next) {
68 if (!(ifa->ifa_flags & IFF_BROADCAST))
continue;
69 if (ifa->ifa_broadaddr ==
nullptr)
continue;
70 if (ifa->ifa_broadaddr->sa_family != AF_INET)
continue;
73 if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](
NetworkAddress const &elem) ->
bool { return elem == addr; })) broadcast->push_back(addr);
89 Debug(net, 3,
"Detected broadcast addresses:");
93 Debug(net, 3,
" {}) {}", i++, addr.GetHostname());
Wrapper for network addresses.
std::vector< NetworkAddress > NetworkAddressList
Type for a list of addresses.
Wrapper for (un)resolved network addresses; there's no reason to transform a numeric IP to a string a...
static const uint16_t NETWORK_DEFAULT_PORT
The default port of the game server (TCP & UDP)
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
void NetworkFindBroadcastIPs(NetworkAddressList *broadcast)
Find the IPv4 broadcast addresses; IPv6 uses a completely different strategy for broadcasting.
static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast)
Internal implementation for finding the broadcast IPs.