changeset 17896:b76a26d921f1 draft

(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
author rubidium <rubidium@openttd.org>
date Sat, 30 Jul 2011 10:28:52 +0000
parents 49e5d88c92d7
children 85ca3c066925
files src/network/core/address.cpp src/network/core/address.h src/network/network_udp.cpp
diffstat 3 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/network/core/address.cpp
+++ b/src/network/core/address.cpp
@@ -132,6 +132,7 @@
 		 * 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;
 }
--- a/src/network/core/address.h
+++ b/src/network/core/address.h
@@ -33,6 +33,7 @@
 	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 @@
 	 */
 	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 @@
 	 * @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 @@
 	 * @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 @@
 	 */
 	bool IsResolved() const
 	{
-		return this->address_length != 0;
+		return this->resolved;
 	}
 
 	bool IsFamily(int family);
--- a/src/network/network_udp.cpp
+++ b/src/network/network_udp.cpp
@@ -491,9 +491,9 @@
 
 	/* 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);