diff options
-rw-r--r-- | src/network/core/address.cpp | 16 | ||||
-rw-r--r-- | src/network/core/address.h | 23 | ||||
-rw-r--r-- | src/network/network.cpp | 2 | ||||
-rw-r--r-- | src/network/network_gamelist.cpp | 13 | ||||
-rw-r--r-- | src/network/network_gamelist.h | 16 | ||||
-rw-r--r-- | src/network/network_gui.cpp | 12 | ||||
-rw-r--r-- | src/network/network_udp.cpp | 12 |
7 files changed, 61 insertions, 33 deletions
diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index bd7f569ae..a29640056 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -14,7 +14,9 @@ const char *NetworkAddress::GetHostname() { if (this->hostname == NULL) { - this->hostname = strdup(inet_ntoa(((struct sockaddr_in *)&this->address)->sin_addr)); + char buf[NETWORK_HOSTNAME_LENGTH] = { '\0' }; + getnameinfo((struct sockaddr *)&this->address, sizeof(this->address), buf, sizeof(buf), NULL, 0, NI_NUMERICHOST); + this->hostname = strdup(buf); } return this->hostname; } @@ -41,6 +43,18 @@ uint16 NetworkAddress::GetPort() const } } +void NetworkAddress::SetPort(uint16 port) +{ + switch (this->address.ss_family) { + case AF_INET: + ((struct sockaddr_in*)&this->address)->sin_port = htons(port); + break; + + default: + NOT_REACHED(); + } +} + const char *NetworkAddress::GetAddressAsString() { /* 6 = for the : and 5 for the decimal port number */ diff --git a/src/network/core/address.h b/src/network/core/address.h index 7488aad3f..faa173493 100644 --- a/src/network/core/address.h +++ b/src/network/core/address.h @@ -33,7 +33,7 @@ public: memset(&this->address, 0, sizeof(this->address)); this->address.ss_family = AF_INET; ((struct sockaddr_in*)&this->address)->sin_addr.s_addr = ip; - ((struct sockaddr_in*)&this->address)->sin_port = htons(port); + this->SetPort(port); } /** @@ -58,7 +58,7 @@ public: { memset(&this->address, 0, sizeof(this->address)); this->address.ss_family = AF_INET; - ((struct sockaddr_in*)&this->address)->sin_port = htons(port); + this->SetPort(port); } /** @@ -111,6 +111,12 @@ public: uint16 GetPort() const; /** + * Set the port + * @param port set the port number + */ + void SetPort(uint16 port); + + /** * Check whether the IP address has been resolved already * @return true iff the port has been resolved */ @@ -118,6 +124,19 @@ public: { return this->resolved; } + + /** + * Compare the address of this class with the address of another. + * @param address the other address. + */ + bool operator == (NetworkAddress &address) + { + if (this->IsResolved() != address.IsResolved()) return false; + + if (this->IsResolved()) return memcmp(&this->address, &address.address, sizeof(this->address)) == 0; + + return this->GetPort() == address.GetPort() && strcmp(this->GetHostname(), address.GetHostname()) == 0; + } }; #endif /* ENABLE_NETWORK */ diff --git a/src/network/network.cpp b/src/network/network.cpp index 7f0279eac..9e78f0411 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -714,7 +714,7 @@ void NetworkRebuildHostList() while (item != NULL && i != lengthof(_network_host_list)) { if (item->manually) { free(_network_host_list[i]); - _network_host_list[i++] = str_fmt("%s:%i", item->info.hostname, item->port); + _network_host_list[i++] = str_fmt("%s:%i", item->info.hostname, item->address.GetPort()); } item = item->next; } diff --git a/src/network/network_gamelist.cpp b/src/network/network_gamelist.cpp index 8d897d9bd..3ade0e204 100644 --- a/src/network/network_gamelist.cpp +++ b/src/network/network_gamelist.cpp @@ -41,7 +41,7 @@ static void NetworkGameListHandleDelayedInsert() NetworkGameList *ins_item = _network_game_delayed_insertion_list; _network_game_delayed_insertion_list = ins_item->next; - NetworkGameList *item = NetworkGameListAddItem(ins_item->ip, ins_item->port); + NetworkGameList *item = NetworkGameListAddItem(ins_item->address); if (item != NULL) { if (StrEmpty(item->info.server_name)) { @@ -63,22 +63,21 @@ static void NetworkGameListHandleDelayedInsert() * @param ip the IP-address (inet_addr) of the to-be added item * @param port the port the server is running on * @return a point to the newly added or already existing item */ -NetworkGameList *NetworkGameListAddItem(uint32 ip, uint16 port) +NetworkGameList *NetworkGameListAddItem(NetworkAddress address) { - if (ip == 0) return NULL; + if (!address.IsResolved()) return NULL; NetworkGameList *item, *prev_item; prev_item = NULL; for (item = _network_game_list; item != NULL; item = item->next) { - if (item->ip == ip && item->port == port) return item; + if (item->address == address) return item; prev_item = item; } item = CallocT<NetworkGameList>(1); item->next = NULL; - item->ip = ip; - item->port = port; + item->address = address; if (prev_item == NULL) { _network_game_list = item; @@ -142,7 +141,7 @@ void NetworkGameListRequery() /* item gets mostly zeroed by NetworkUDPQueryServer */ uint8 retries = item->retries; - NetworkUDPQueryServer(NetworkAddress(item->ip, item->port)); + NetworkUDPQueryServer(NetworkAddress(item->address)); item->retries = (retries >= REFRESH_GAMEINFO_X_REQUERIES) ? 0 : retries; } } diff --git a/src/network/network_gamelist.h b/src/network/network_gamelist.h index bf7bc68c2..4ef0ac756 100644 --- a/src/network/network_gamelist.h +++ b/src/network/network_gamelist.h @@ -5,24 +5,24 @@ #ifndef NETWORK_GAMELIST_H #define NETWORK_GAMELIST_H +#include "core/address.h" #include "network_type.h" /** Structure with information shown in the game list (GUI) */ struct NetworkGameList { - NetworkGameInfo info; ///< The game information of this server - uint32 ip; ///< The IP of the game server - uint16 port; ///< The port of the game server - bool online; ///< False if the server did not respond (default status) - bool manually; ///< True if the server was added manually - uint8 retries; ///< Number of retries (to stop requerying) - NetworkGameList *next; ///< Next pointer to make a linked game list + NetworkGameInfo info; ///< The game information of this server + NetworkAddress address; ///< The connection info of the game server + bool online; ///< False if the server did not respond (default status) + bool manually; ///< True if the server was added manually + uint8 retries; ///< Number of retries (to stop requerying) + NetworkGameList *next; ///< Next pointer to make a linked game list }; /** Game list of this client */ extern NetworkGameList *_network_game_list; void NetworkGameListAddItemDelayed(NetworkGameList *item); -NetworkGameList *NetworkGameListAddItem(uint32 ip, uint16 port); +NetworkGameList *NetworkGameListAddItem(NetworkAddress address); void NetworkGameListRemoveItem(NetworkGameList *remove); void NetworkGameListRequery(); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 36312190f..3b85b8a03 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -403,7 +403,7 @@ public: y += NET_PRC__SIZE_OF_ROW; } - const NetworkGameList *last_joined = NetworkGameListAddItem(inet_addr(_settings_client.network.last_host), _settings_client.network.last_port); + const NetworkGameList *last_joined = NetworkGameListAddItem(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); /* Draw the last joined server, if any */ if (last_joined != NULL) this->DrawServerLine(last_joined, y = this->widget[NGWW_LASTJOINED].top + 3, last_joined == sel); @@ -454,7 +454,7 @@ public: y += 10; SetDParamStr(0, sel->info.hostname); - SetDParam(1, sel->port); + SetDParam(1, sel->address.GetPort()); DrawString(x, this->widget[NGWW_DETAILS].right, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address y += 10; @@ -523,7 +523,7 @@ public: } break; case NGWW_LASTJOINED: { - NetworkGameList *last_joined = NetworkGameListAddItem(inet_addr(_settings_client.network.last_host), _settings_client.network.last_port); + NetworkGameList *last_joined = NetworkGameListAddItem(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); if (last_joined != NULL) { this->server = last_joined; @@ -562,14 +562,14 @@ public: case NGWW_JOIN: // Join Game if (this->server != NULL) { - snprintf(_settings_client.network.last_host, sizeof(_settings_client.network.last_host), "%s", inet_ntoa(*(struct in_addr *)&this->server->ip)); - _settings_client.network.last_port = this->server->port; + snprintf(_settings_client.network.last_host, sizeof(_settings_client.network.last_host), "%s", this->server->address.GetHostname()); + _settings_client.network.last_port = this->server->address.GetPort(); ShowNetworkLobbyWindow(this->server); } break; case NGWW_REFRESH: // Refresh - if (this->server != NULL) NetworkUDPQueryServer(NetworkAddress(this->server->info.hostname, this->server->port)); + if (this->server != NULL) NetworkUDPQueryServer(this->server->address); break; case NGWW_NEWGRF: // NewGRF Settings diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index a509eb09e..7032ab341 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -220,7 +220,7 @@ DEF_UDP_RECEIVE_COMMAND(Client, PACKET_UDP_SERVER_RESPONSE) DEBUG(net, 4, "[udp] server response from %s", client_addr->GetAddressAsString()); /* Find next item */ - item = NetworkGameListAddItem(client_addr->GetIP(), client_addr->GetPort()); + item = NetworkGameListAddItem(*client_addr); this->Recv_NetworkGameInfo(p, &item->info); @@ -254,8 +254,7 @@ DEF_UDP_RECEIVE_COMMAND(Client, PACKET_UDP_SERVER_RESPONSE) this->Send_GRFIdentifier(&packet, in_request[i]); } - NetworkAddress out_addr(item->ip, item->port); - this->SendPacket(&packet, &out_addr); + this->SendPacket(&packet, &item->address); } } @@ -428,12 +427,9 @@ void NetworkUDPQueryServerThread(void *pntr) { NetworkUDPQueryServerInfo *info = (NetworkUDPQueryServerInfo*)pntr; - NetworkAddress out_addr(info->GetIP(), info->GetPort()); - /* Clear item in gamelist */ NetworkGameList *item = CallocT<NetworkGameList>(1); - item->ip = info->GetIP(); - item->port = info->GetPort(); + item->address = NetworkAddress(*info); strecpy(item->info.server_name, info->GetHostname(), lastof(item->info.server_name)); strecpy(item->info.hostname, info->GetHostname(), lastof(item->info.hostname)); item->manually = info->manually; @@ -442,7 +438,7 @@ void NetworkUDPQueryServerThread(void *pntr) _network_udp_mutex->BeginCritical(); /* Init the packet */ Packet p(PACKET_UDP_CLIENT_FIND_SERVER); - if (_udp_client_socket != NULL) _udp_client_socket->SendPacket(&p, &out_addr); + if (_udp_client_socket != NULL) _udp_client_socket->SendPacket(&p, info); _network_udp_mutex->EndCritical(); delete info; |