diff options
author | rubidium <rubidium@openttd.org> | 2011-07-30 10:28:52 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2011-07-30 10:28:52 +0000 |
commit | 289133be148788a19a965f807e7b824c4d26f872 (patch) | |
tree | fa0820207322815661878611fb98b8b6013475d5 | |
parent | ba7611ed131b0f99dae4ca974aa1cf9c6114b6f5 (diff) | |
download | openttd-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.cpp | 1 | ||||
-rw-r--r-- | src/network/core/address.h | 12 | ||||
-rw-r--r-- | src/network/network_udp.cpp | 2 |
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); |