From 45c26c3f46db07c07edc26b26fde984a9f3a718f Mon Sep 17 00:00:00 2001 From: Leon Krieg Date: Mon, 26 Jan 2026 00:47:19 +0100 Subject: [PATCH] Parse IP addresses without inet_addr --- src/server/shared/Realms/RealmList.cpp | 67 +++++++++++++++++++------- src/server/shared/Realms/RealmList.h | 2 +- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/server/shared/Realms/RealmList.cpp b/src/server/shared/Realms/RealmList.cpp index 142ed6a..40371bc 100644 --- a/src/server/shared/Realms/RealmList.cpp +++ b/src/server/shared/Realms/RealmList.cpp @@ -19,12 +19,18 @@ #include "DatabaseEnv.h" #include "Log.h" #include "QueryResult.h" -#include "Resolver.h" #include "SteadyTimer.h" #include "Util.h" #include #include +#ifdef _WIN32 +#include +#else +#include +#include +#endif + RealmList::RealmList() : _updateInterval(0) { } RealmList* RealmList::Instance() @@ -38,7 +44,7 @@ void RealmList::Initialize(Acore::Asio::IoContext& ioContext, uint32 updateInter { _updateInterval = updateInterval; _updateTimer = std::make_unique(ioContext); - _resolver = std::make_unique(ioContext); + // _resolver = std::make_unique(ioContext); LoadBuildInfo(); @@ -160,29 +166,55 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) std::string localSubmaskString = fields[4].Get(); uint16 port = fields[5].Get(); - Optional externalAddress = _resolver->Resolve(boost::asio::ip::tcp::v4(), externalAddressString, ""); - if (!externalAddress) + // Parse IP addresses directly without resolver using inet_addr + Optional externalAddress; + Optional localAddress; + Optional localSubmask; + + // Parse external address + unsigned long ip = inet_addr(externalAddressString.c_str()); + if (ip != INADDR_NONE) { - LOG_ERROR("server.authserver", "Could not resolve address {} for realm \"{}\" id {}", externalAddressString, name, realmId); - continue; + boost::asio::ip::address_v4 addr(ntohl(ip)); + externalAddress = boost::asio::ip::tcp::endpoint(addr, port); + } + else + { + LOG_WARN("server.authserver", "Using fallback for address {} for realm \"{}\" id {}", externalAddressString, name, realmId); + boost::asio::ip::address_v4 addr(boost::asio::ip::address_v4::loopback()); + externalAddress = boost::asio::ip::tcp::endpoint(addr, port); } - Optional localAddress = _resolver->Resolve(boost::asio::ip::tcp::v4(), localAddressString, ""); - if (!localAddress) + // Parse local address + ip = inet_addr(localAddressString.c_str()); + if (ip != INADDR_NONE) { - LOG_ERROR("server.authserver", "Could not resolve localAddress {} for realm \"{}\" id {}", localAddressString, name, realmId); - continue; + boost::asio::ip::address_v4 addr(ntohl(ip)); + localAddress = boost::asio::ip::tcp::endpoint(addr, port); + } + else + { + LOG_WARN("server.authserver", "Using fallback for localAddress {} for realm \"{}\" id {}", localAddressString, name, realmId); + boost::asio::ip::address_v4 addr(boost::asio::ip::address_v4::loopback()); + localAddress = boost::asio::ip::tcp::endpoint(addr, port); } - Optional localSubmask = _resolver->Resolve(boost::asio::ip::tcp::v4(), localSubmaskString, ""); - if (!localSubmask) + // Parse subnet mask + ip = inet_addr(localSubmaskString.c_str()); + if (ip != INADDR_NONE) { - LOG_ERROR("server.authserver", "Could not resolve localSubnetMask {} for realm \"{}\" id {}", localSubmaskString, name, realmId); - continue; + boost::asio::ip::address_v4 addr(ntohl(ip)); + localSubmask = boost::asio::ip::tcp::endpoint(addr, 0); + } + else + { + LOG_WARN("server.authserver", "Using fallback for localSubnetMask {} for realm \"{}\" id {}", localSubmaskString, name, realmId); + // 255.255.255.0 = 0xFFFFFF00 + boost::asio::ip::address_v4 addr(0xFFFFFF00); + localSubmask = boost::asio::ip::tcp::endpoint(addr, 0); } uint8 icon = fields[6].Get(); - if (icon == REALM_TYPE_FFA_PVP) { icon = REALM_TYPE_PVP; @@ -198,7 +230,6 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) uint8 allowedSecurityLevel = fields[9].Get(); float pop = fields[10].Get(); uint32 build = fields[11].Get(); - RealmHandle id{ realmId }; UpdateRealm(id, build, name, externalAddress->address(), localAddress->address(), localSubmask->address(), port, icon, flag, @@ -211,8 +242,8 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) else { LOG_DEBUG("server.authserver", "Updating realm \"{}\" at {}:{}.", name, externalAddressString, port); - } + } existingRealms.erase(id); } catch (std::exception const& ex) @@ -222,7 +253,7 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) } } } - + for (auto itr = existingRealms.begin(); itr != existingRealms.end(); ++itr) LOG_INFO("server.authserver", "Removed realm \"{}\".", itr->second); diff --git a/src/server/shared/Realms/RealmList.h b/src/server/shared/Realms/RealmList.h index cb85b32..9990151 100644 --- a/src/server/shared/Realms/RealmList.h +++ b/src/server/shared/Realms/RealmList.h @@ -77,7 +77,7 @@ private: RealmMap _realms; uint32 _updateInterval{0}; std::unique_ptr _updateTimer; - std::unique_ptr _resolver; + // std::unique_ptr _resolver; }; #define sRealmList RealmList::Instance()