From 289133be148788a19a965f807e7b824c4d26f872 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 30 Jul 2011 10:28:52 +0000 Subject: (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 --- src/network/core/address.cpp | 1 + src/network/core/address.h | 12 ++++++++---- 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(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); -- cgit v1.2.3-70-g09d2