summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-07-30 10:28:52 +0000
committerrubidium <rubidium@openttd.org>2011-07-30 10:28:52 +0000
commit289133be148788a19a965f807e7b824c4d26f872 (patch)
treefa0820207322815661878611fb98b8b6013475d5
parentba7611ed131b0f99dae4ca974aa1cf9c6114b6f5 (diff)
downloadopenttd-289133be148788a19a965f807e7b824c4d26f872.tar.xz
(svn r22695) -Fix [FS#4697]: mark addresses that could not be resolved as 'do not resolve anymore' as well, instead of trying to resolve them each and every time the address is accessed
-rw-r--r--src/network/core/address.cpp1
-rw-r--r--src/network/core/address.h12
-rw-r--r--src/network/network_udp.cpp2
3 files changed, 10 insertions, 5 deletions
diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp
index cb93e66b3..371f53403 100644
--- a/src/network/core/address.cpp
+++ b/src/network/core/address.cpp
@@ -132,6 +132,7 @@ const sockaddr_storage *NetworkAddress::GetAddress()
* that means "don't care whether it is SOCK_STREAM or SOCK_DGRAM".
*/
this->Resolve(this->address.ss_family, SOCK_STREAM, AI_ADDRCONFIG, NULL, ResolveLoopProc);
+ this->resolved = true;
}
return &this->address;
}
diff --git a/src/network/core/address.h b/src/network/core/address.h
index d2d43b4a9..9fd40eaee 100644
--- a/src/network/core/address.h
+++ b/src/network/core/address.h
@@ -33,6 +33,7 @@ private:
char hostname[NETWORK_HOSTNAME_LENGTH]; ///< The hostname
int address_length; ///< The length of the resolved address
sockaddr_storage address; ///< The resolved address
+ bool resolved; ///< Whether the address has been (tried to be) resolved
/**
* Helper function to resolve something to a socket.
@@ -50,7 +51,8 @@ public:
*/
NetworkAddress(struct sockaddr_storage &address, int address_length) :
address_length(address_length),
- address(address)
+ address(address),
+ resolved(address_length != 0)
{
*this->hostname = '\0';
}
@@ -61,7 +63,8 @@ public:
* @param address_length The length of the address.
*/
NetworkAddress(sockaddr *address, int address_length) :
- address_length(address_length)
+ address_length(address_length),
+ resolved(address_length != 0)
{
*this->hostname = '\0';
memset(&this->address, 0, sizeof(this->address));
@@ -75,7 +78,8 @@ public:
* @param family the address family
*/
NetworkAddress(const char *hostname = "", uint16 port = 0, int family = AF_UNSPEC) :
- address_length(0)
+ address_length(0),
+ resolved(false)
{
/* Also handle IPv6 bracket enclosed hostnames */
if (StrEmpty(hostname)) hostname = "";
@@ -123,7 +127,7 @@ public:
*/
bool IsResolved() const
{
- return this->address_length != 0;
+ return this->resolved;
}
bool IsFamily(int family);
diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp
index 49b482900..3f7e8e087 100644
--- a/src/network/network_udp.cpp
+++ b/src/network/network_udp.cpp
@@ -491,9 +491,9 @@ static void NetworkUDPQueryServerThread(void *pntr)
/* Clear item in gamelist */
NetworkGameList *item = CallocT<NetworkGameList>(1);
- item->address = *info;
info->GetAddressAsString(item->info.server_name, lastof(item->info.server_name));
strecpy(item->info.hostname, info->GetHostname(), lastof(item->info.hostname));
+ item->address = *info;
item->manually = info->manually;
NetworkGameListAddItemDelayed(item);