summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-04-08 17:51:04 +0000
committerrubidium <rubidium@openttd.org>2009-04-08 17:51:04 +0000
commit080095ade5e6dc330529ff01d66c14c844aa7005 (patch)
tree4e05169cad087736da37833cbbd06e8d61b41a6f
parentcd8da0d69eaec81702ca033f375957bb24acdbf1 (diff)
downloadopenttd-080095ade5e6dc330529ff01d66c14c844aa7005.tar.xz
(svn r15984) -Codechange: prepare the UDP receiver to process multiple types of returned server lists.
-rw-r--r--src/network/core/address.cpp4
-rw-r--r--src/network/core/udp.h9
-rw-r--r--src/network/network_udp.cpp7
3 files changed, 15 insertions, 5 deletions
diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp
index 963a2e970..d14d1dab6 100644
--- a/src/network/core/address.cpp
+++ b/src/network/core/address.cpp
@@ -58,9 +58,9 @@ const char *NetworkAddress::GetAddressAsString(bool with_family)
/* 6 = for the : and 5 for the decimal port number */
static char buf[NETWORK_HOSTNAME_LENGTH + 6 + 7];
char *p = buf;
- if (this->address.ss_family == AF_INET6) p = strecpy(p, "[", lastof(buf));
+ if (this->GetAddress()->ss_family == AF_INET6) p = strecpy(p, "[", lastof(buf));
p = strecpy(p, this->GetHostname(), lastof(buf));
- if (this->address.ss_family == AF_INET6) p = strecpy(p, "]", lastof(buf));
+ if (this->GetAddress()->ss_family == AF_INET6) p = strecpy(p, "]", lastof(buf));
p += seprintf(p, lastof(buf), ":%d", this->GetPort());
if (with_family) {
diff --git a/src/network/core/udp.h b/src/network/core/udp.h
index 2302dab0d..6f68c213d 100644
--- a/src/network/core/udp.h
+++ b/src/network/core/udp.h
@@ -90,6 +90,15 @@ enum PacketUDPType {
PACKET_UDP_END ///< Must ALWAYS be on the end of this list!! (period)
};
+/** The types of server lists we can get */
+enum ServerListType {
+ SLT_IPv4 = 0, ///< Get the IPv4 addresses
+ SLT_IPv6 = 1, ///< Get the IPv6 addresses
+ SLT_AUTODETECT, ///< Autodetect the type based on the connection
+
+ SLT_END = SLT_AUTODETECT ///< End of 'arrays' marker
+};
+
#define DECLARE_UDP_RECEIVE_COMMAND(type) virtual void NetworkPacketReceive_## type ##_command(Packet *p, NetworkAddress *client_addr)
#define DEF_UDP_RECEIVE_COMMAND(cls, type) void cls ##NetworkUDPSocketHandler::NetworkPacketReceive_ ## type ## _command(Packet *p, NetworkAddress *client_addr)
diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp
index 15677d0fe..f9c2f98ca 100644
--- a/src/network/network_udp.cpp
+++ b/src/network/network_udp.cpp
@@ -286,12 +286,12 @@ DEF_UDP_RECEIVE_COMMAND(Client, PACKET_UDP_MASTER_RESPONSE_LIST)
/* packet begins with the protocol version (uint8)
* then an uint16 which indicates how many
* ip:port pairs are in this packet, after that
- * an uint32 (ip) and an uint16 (port) for each pair
+ * an uint32 (ip) and an uint16 (port) for each pair.
*/
- uint8 ver = p->Recv_uint8();
+ ServerListType type = (ServerListType)(p->Recv_uint8() - 1);
- if (ver == 1) {
+ if (type < SLT_END) {
for (int i = p->Recv_uint16(); i != 0 ; i--) {
uint32 ip = TO_LE32(p->Recv_uint32());
uint16 port = p->Recv_uint16();
@@ -390,6 +390,7 @@ void NetworkUDPQueryMasterServer()
/* packet only contains protocol version */
p.Send_uint8(NETWORK_MASTER_SERVER_VERSION);
+ p.Send_uint8(SLT_AUTODETECT);
_udp_client_socket->SendPacket(&p, &out_addr, true);