diff options
author | rubidium <rubidium@openttd.org> | 2009-04-02 20:17:46 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-04-02 20:17:46 +0000 |
commit | 1e205e01b83ac995c14105e0eb1f992cbd3e0625 (patch) | |
tree | a5d71eebbdd7eef0f674eaff8b56f9a5785084f9 /src/network/core | |
parent | c0c6e07081fb55d1ec5c46cc3606185062cfe45c (diff) | |
download | openttd-1e205e01b83ac995c14105e0eb1f992cbd3e0625.tar.xz |
(svn r15916) -Codechange: let the network game list use NetworkAddress
Diffstat (limited to 'src/network/core')
-rw-r--r-- | src/network/core/address.cpp | 16 | ||||
-rw-r--r-- | src/network/core/address.h | 23 |
2 files changed, 36 insertions, 3 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 */ |