From b97c56cd2696c2eec828805f776765e8253207c4 Mon Sep 17 00:00:00 2001 From: lotodore Date: Fri, 30 Nov 2007 21:28:38 +0000 Subject: [PATCH] Use alternate dns name if name resolution fails for internet server (6dns.org seems to be unreliable, but is still the only one to provide both ipv4 and ipv6 name resolution for free). --- src/net/clientcontext.h | 5 +++++ src/net/clientthread.h | 1 + src/net/common/clientthread.cpp | 4 +++- src/net/common/resolverthread.cpp | 14 ++++++++++++++ src/session.cpp | 9 ++++++++- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/net/clientcontext.h b/src/net/clientcontext.h index 5dbaf784..ea5c8ccd 100644 --- a/src/net/clientcontext.h +++ b/src/net/clientcontext.h @@ -47,6 +47,10 @@ public: {return m_serverAddr;} void SetServerAddr(const std::string &serverAddr) {m_serverAddr = serverAddr;} + const std::string &GetAlternateServerAddr() const + {return m_alternateServerAddr;} + void SetAlternateServerAddr(const std::string &serverAddr) + {m_alternateServerAddr = serverAddr;} unsigned GetServerPort() const {return m_serverPort;} void SetServerPort(unsigned serverPort) @@ -79,6 +83,7 @@ private: int m_protocol; int m_addrFamily; std::string m_serverAddr; + std::string m_alternateServerAddr; unsigned m_serverPort; std::string m_password; sockaddr_storage m_clientSockaddr; diff --git a/src/net/clientthread.h b/src/net/clientthread.h index b27d2942..dbb3cc3a 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -48,6 +48,7 @@ public: // (i.e. after starting the thread). void Init( const std::string &serverAddress, + const std::string &alternateServerAddress, unsigned serverPort, bool ipv6, bool sctp, diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index cd94179c..9efe24e0 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -70,7 +70,8 @@ ClientThread::~ClientThread() void ClientThread::Init( - const string &serverAddress, unsigned serverPort, bool ipv6, bool sctp, + const string &serverAddress, const string &alternateServerAddress, + unsigned serverPort, bool ipv6, bool sctp, const string &pwd, const string &playerName, const string &avatarFile) { if (IsRunning()) @@ -84,6 +85,7 @@ ClientThread::Init( context.SetProtocol(sctp ? SOCKET_IPPROTO_SCTP : 0); context.SetAddrFamily(ipv6 ? AF_INET6 : AF_INET); context.SetServerAddr(serverAddress); + context.SetAlternateServerAddr(alternateServerAddress); context.SetServerPort(serverPort); context.SetPassword(pwd); context.SetPlayerName(playerName); diff --git a/src/net/common/resolverthread.cpp b/src/net/common/resolverthread.cpp index a19e78c3..5501e1e0 100644 --- a/src/net/common/resolverthread.cpp +++ b/src/net/common/resolverthread.cpp @@ -45,6 +45,7 @@ ResolverThread::Init(const ClientContext &context) GetContext().SetAddrFamily(context.GetAddrFamily()); GetContext().SetServerAddr(context.GetServerAddr()); + GetContext().SetAlternateServerAddr(context.GetAlternateServerAddr()); GetContext().SetServerPort(context.GetServerPort()); } @@ -78,6 +79,19 @@ ResolverThread::Main() context.GetProtocol(), (struct sockaddr *)context.GetClientSockaddr(), context.GetClientSockaddrSize()); + + if (!m_retVal && !context.GetAlternateServerAddr().empty()) + { + // Try alternate name. + m_retVal = socket_resolve( + context.GetAlternateServerAddr().c_str(), + tmpStr.str().c_str(), + context.GetAddrFamily(), + SOCK_STREAM, + context.GetProtocol(), + (struct sockaddr *)context.GetClientSockaddr(), + context.GetClientSockaddrSize()); + } } const ClientContext & diff --git a/src/session.cpp b/src/session.cpp index 48c6522e..ad92b242 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -162,8 +162,13 @@ void Session::startInternetClient() } myNetClient = new ClientThread(*myGui, *myAvatarManager); + string internetServerAddr(myConfig->readConfigString("InternetServerAddress")); + string alternateServerAddr; + if (internetServerAddr == "pokerth.6dns.org") + alternateServerAddr = "pokerth.dyndns.org"; myNetClient->Init( - myConfig->readConfigString("InternetServerAddress"), + internetServerAddr, + alternateServerAddr, myConfig->readConfigInt("InternetServerPort"), myConfig->readConfigInt("InternetServerUseIpv6") == 1, myConfig->readConfigInt("InternetServerUseSctp") == 1, @@ -185,6 +190,7 @@ void Session::startNetworkClient(const string &serverAddress, unsigned serverPor myNetClient = new ClientThread(*myGui, *myAvatarManager); myNetClient->Init( serverAddress, + "", serverPort, ipv6, sctp, @@ -209,6 +215,7 @@ void Session::startNetworkClientForLocalServer(const GameData &gameData) const char *loopbackAddr = useIpv6 ? "::1" : "127.0.0.1"; myNetClient->Init( loopbackAddr, + "", myConfig->readConfigInt("ServerPort"), useIpv6, myConfig->readConfigInt("ServerUseSctp") == 1,