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).
This commit is contained in:
@@ -47,6 +47,10 @@ public:
|
|||||||
{return m_serverAddr;}
|
{return m_serverAddr;}
|
||||||
void SetServerAddr(const std::string &serverAddr)
|
void SetServerAddr(const std::string &serverAddr)
|
||||||
{m_serverAddr = serverAddr;}
|
{m_serverAddr = serverAddr;}
|
||||||
|
const std::string &GetAlternateServerAddr() const
|
||||||
|
{return m_alternateServerAddr;}
|
||||||
|
void SetAlternateServerAddr(const std::string &serverAddr)
|
||||||
|
{m_alternateServerAddr = serverAddr;}
|
||||||
unsigned GetServerPort() const
|
unsigned GetServerPort() const
|
||||||
{return m_serverPort;}
|
{return m_serverPort;}
|
||||||
void SetServerPort(unsigned serverPort)
|
void SetServerPort(unsigned serverPort)
|
||||||
@@ -79,6 +83,7 @@ private:
|
|||||||
int m_protocol;
|
int m_protocol;
|
||||||
int m_addrFamily;
|
int m_addrFamily;
|
||||||
std::string m_serverAddr;
|
std::string m_serverAddr;
|
||||||
|
std::string m_alternateServerAddr;
|
||||||
unsigned m_serverPort;
|
unsigned m_serverPort;
|
||||||
std::string m_password;
|
std::string m_password;
|
||||||
sockaddr_storage m_clientSockaddr;
|
sockaddr_storage m_clientSockaddr;
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public:
|
|||||||
// (i.e. after starting the thread).
|
// (i.e. after starting the thread).
|
||||||
void Init(
|
void Init(
|
||||||
const std::string &serverAddress,
|
const std::string &serverAddress,
|
||||||
|
const std::string &alternateServerAddress,
|
||||||
unsigned serverPort,
|
unsigned serverPort,
|
||||||
bool ipv6,
|
bool ipv6,
|
||||||
bool sctp,
|
bool sctp,
|
||||||
|
|||||||
@@ -70,7 +70,8 @@ ClientThread::~ClientThread()
|
|||||||
|
|
||||||
void
|
void
|
||||||
ClientThread::Init(
|
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)
|
const string &pwd, const string &playerName, const string &avatarFile)
|
||||||
{
|
{
|
||||||
if (IsRunning())
|
if (IsRunning())
|
||||||
@@ -84,6 +85,7 @@ ClientThread::Init(
|
|||||||
context.SetProtocol(sctp ? SOCKET_IPPROTO_SCTP : 0);
|
context.SetProtocol(sctp ? SOCKET_IPPROTO_SCTP : 0);
|
||||||
context.SetAddrFamily(ipv6 ? AF_INET6 : AF_INET);
|
context.SetAddrFamily(ipv6 ? AF_INET6 : AF_INET);
|
||||||
context.SetServerAddr(serverAddress);
|
context.SetServerAddr(serverAddress);
|
||||||
|
context.SetAlternateServerAddr(alternateServerAddress);
|
||||||
context.SetServerPort(serverPort);
|
context.SetServerPort(serverPort);
|
||||||
context.SetPassword(pwd);
|
context.SetPassword(pwd);
|
||||||
context.SetPlayerName(playerName);
|
context.SetPlayerName(playerName);
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ ResolverThread::Init(const ClientContext &context)
|
|||||||
|
|
||||||
GetContext().SetAddrFamily(context.GetAddrFamily());
|
GetContext().SetAddrFamily(context.GetAddrFamily());
|
||||||
GetContext().SetServerAddr(context.GetServerAddr());
|
GetContext().SetServerAddr(context.GetServerAddr());
|
||||||
|
GetContext().SetAlternateServerAddr(context.GetAlternateServerAddr());
|
||||||
GetContext().SetServerPort(context.GetServerPort());
|
GetContext().SetServerPort(context.GetServerPort());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +79,19 @@ ResolverThread::Main()
|
|||||||
context.GetProtocol(),
|
context.GetProtocol(),
|
||||||
(struct sockaddr *)context.GetClientSockaddr(),
|
(struct sockaddr *)context.GetClientSockaddr(),
|
||||||
context.GetClientSockaddrSize());
|
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 &
|
const ClientContext &
|
||||||
|
|||||||
+8
-1
@@ -162,8 +162,13 @@ void Session::startInternetClient()
|
|||||||
}
|
}
|
||||||
|
|
||||||
myNetClient = new ClientThread(*myGui, *myAvatarManager);
|
myNetClient = new ClientThread(*myGui, *myAvatarManager);
|
||||||
|
string internetServerAddr(myConfig->readConfigString("InternetServerAddress"));
|
||||||
|
string alternateServerAddr;
|
||||||
|
if (internetServerAddr == "pokerth.6dns.org")
|
||||||
|
alternateServerAddr = "pokerth.dyndns.org";
|
||||||
myNetClient->Init(
|
myNetClient->Init(
|
||||||
myConfig->readConfigString("InternetServerAddress"),
|
internetServerAddr,
|
||||||
|
alternateServerAddr,
|
||||||
myConfig->readConfigInt("InternetServerPort"),
|
myConfig->readConfigInt("InternetServerPort"),
|
||||||
myConfig->readConfigInt("InternetServerUseIpv6") == 1,
|
myConfig->readConfigInt("InternetServerUseIpv6") == 1,
|
||||||
myConfig->readConfigInt("InternetServerUseSctp") == 1,
|
myConfig->readConfigInt("InternetServerUseSctp") == 1,
|
||||||
@@ -185,6 +190,7 @@ void Session::startNetworkClient(const string &serverAddress, unsigned serverPor
|
|||||||
myNetClient = new ClientThread(*myGui, *myAvatarManager);
|
myNetClient = new ClientThread(*myGui, *myAvatarManager);
|
||||||
myNetClient->Init(
|
myNetClient->Init(
|
||||||
serverAddress,
|
serverAddress,
|
||||||
|
"",
|
||||||
serverPort,
|
serverPort,
|
||||||
ipv6,
|
ipv6,
|
||||||
sctp,
|
sctp,
|
||||||
@@ -209,6 +215,7 @@ void Session::startNetworkClientForLocalServer(const GameData &gameData)
|
|||||||
const char *loopbackAddr = useIpv6 ? "::1" : "127.0.0.1";
|
const char *loopbackAddr = useIpv6 ? "::1" : "127.0.0.1";
|
||||||
myNetClient->Init(
|
myNetClient->Init(
|
||||||
loopbackAddr,
|
loopbackAddr,
|
||||||
|
"",
|
||||||
myConfig->readConfigInt("ServerPort"),
|
myConfig->readConfigInt("ServerPort"),
|
||||||
useIpv6,
|
useIpv6,
|
||||||
myConfig->readConfigInt("ServerUseSctp") == 1,
|
myConfig->readConfigInt("ServerUseSctp") == 1,
|
||||||
|
|||||||
Reference in New Issue
Block a user