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:
parent
283159c5ff
commit
8ca5d14516
1 changed files with 48 additions and 24 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue