summaryrefslogtreecommitdiff
path: root/src/network/core
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-04-02 20:17:46 +0000
committerrubidium <rubidium@openttd.org>2009-04-02 20:17:46 +0000
commit1e205e01b83ac995c14105e0eb1f992cbd3e0625 (patch)
treea5d71eebbdd7eef0f674eaff8b56f9a5785084f9 /src/network/core
parentc0c6e07081fb55d1ec5c46cc3606185062cfe45c (diff)
downloadopenttd-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.cpp16
-rw-r--r--src/network/core/address.h23
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 */