1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

Fix Duplicate Servers in Server List

This commit is contained in:
DustyBagel 2025-01-02 18:02:17 -06:00
parent 283159c5ff
commit 8ca5d14516

View file

@ -69,7 +69,7 @@ typedef int socket_t;
const char* adv_multicast_addr = "224.1.1.1"; const char* adv_multicast_addr = "224.1.1.1";
const static unsigned short int adv_port = 29998; const static unsigned short int adv_port = 29998;
const char* proto = "Luanti"; const std::string proto = "Luanti";
static std::string ask_str; static std::string ask_str;
bool use_ipv6 = true; bool use_ipv6 = true;
@ -94,7 +94,7 @@ void lan_adv::ask()
void lan_adv::send_string(const std::string &str) void lan_adv::send_string(const std::string &str)
{ {
if (g_settings->getBool("enable_ipv6")) { if (g_settings->getBool("ipv6_server")) {
std::vector<uint32_t> scopes; std::vector<uint32_t> scopes;
// todo: windows and android // todo: windows and android
@ -150,36 +150,60 @@ void lan_adv::send_string(const std::string &str)
socket_send.Send(Address(addr), str.c_str(), str.size()); socket_send.Send(Address(addr), str.c_str(), str.size());
} }
} catch (const std::exception &e) { } catch (const std::exception &e) {
verbosestream << "udp broadcast send over ipv6 fail " << e.what() << "\n"; verbosestream << "udp multicast send over ipv6 fail [" << e.what() << "]\n" << "Trying ipv4.\n";
try {
sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(adv_port);
UDPSocket socket_send(false);
inet_pton(AF_INET, adv_multicast_addr, &(addr.sin_addr));
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(adv_multicast_addr);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(socket_send.GetHandle(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
(const char *)&mreq, sizeof(mreq));
//int set_option_on = 2;
//setsockopt(socket_send.GetHandle(), SOL_SOCKET, IP_MULTICAST_TTL,
// (const char *)&set_option_on, sizeof(set_option_on));
socket_send.Send(Address(addr), str.c_str(), str.size());
} catch (const std::exception &e) {
verbosestream << "udp mulitcast send over ipv4 fail too. " << e.what() << "\n";
}
} }
} }
freeaddrinfo(result); freeaddrinfo(result);
} }
} } else {
try {
sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(adv_port);
UDPSocket socket_send(false);
try { inet_pton(AF_INET, adv_multicast_addr, &(addr.sin_addr));
sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(adv_port);
UDPSocket socket_send(false);
inet_pton(AF_INET, adv_multicast_addr, &(addr.sin_addr)); struct ip_mreq mreq;
struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(adv_multicast_addr);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
mreq.imr_multiaddr.s_addr = inet_addr(adv_multicast_addr); setsockopt(socket_send.GetHandle(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
mreq.imr_interface.s_addr = htonl(INADDR_ANY); (const char *)&mreq, sizeof(mreq));
setsockopt(socket_send.GetHandle(), IPPROTO_IP, IP_ADD_MEMBERSHIP, //int set_option_on = 2;
(const char *)&mreq, sizeof(mreq)); //setsockopt(socket_send.GetHandle(), SOL_SOCKET, IP_MULTICAST_TTL,
// (const char *)&set_option_on, sizeof(set_option_on));
//int set_option_on = 2; socket_send.Send(Address(addr), str.c_str(), str.size());
//setsockopt(socket_send.GetHandle(), SOL_SOCKET, IP_MULTICAST_TTL, } catch (const std::exception &e) {
// (const char *)&set_option_on, sizeof(set_option_on)); verbosestream << "udp mulitcast send over ipv4 fail " << e.what() << "\n";
}
socket_send.Send(Address(addr), str.c_str(), str.size());
} catch (const std::exception &e) {
verbosestream << "udp broadcast send over ipv4 fail " << e.what() << "\n";
} }
} }
@ -195,7 +219,7 @@ void *lan_adv::run()
BEGIN_DEBUG_EXCEPTION_HANDLER; BEGIN_DEBUG_EXCEPTION_HANDLER;
setName("lan_adv " + (server_port ? std::string("server") : std::string("client"))); setName("lan_adv " + (server_port ? std::string("server") : std::string("client")));
UDPSocket socket_recv(g_settings->getBool("enable_ipv6")); UDPSocket socket_recv(g_settings->getBool("ipv6_server"));
int set_option_off = 0, set_option_on = 1; int set_option_off = 0, set_option_on = 1;
setsockopt(socket_recv.GetHandle(), SOL_SOCKET, SO_REUSEADDR, setsockopt(socket_recv.GetHandle(), SOL_SOCKET, SO_REUSEADDR,
@ -215,7 +239,7 @@ void *lan_adv::run()
(const char *)&set_option_off, sizeof(set_option_off)); (const char *)&set_option_off, sizeof(set_option_off));
socket_recv.setTimeoutMs(200); socket_recv.setTimeoutMs(200);
if (g_settings->getBool("enable_ipv6")) { if (g_settings->getBool("ipv6_server")) {
try { try {
socket_recv.Bind(Address(in6addr_any, adv_port)); socket_recv.Bind(Address(in6addr_any, adv_port));
} catch (const std::exception &e) { } catch (const std::exception &e) {