(svn r1106) -Add: [Network] Added master-server protocol and advertise to
authortruelight
Wed, 15 Dec 2004 20:10:34 +0000
changeset 668 346853c8b513
parent 667 0a95b09599ac
child 669 75646b8921be
(svn r1106) -Add: [Network] Added master-server protocol and advertise to
master-server option. No GUI yet, and disabled by default (it still is WIP)
network.c
network.h
network_data.h
network_server.c
network_udp.c
network_udp.h
--- a/network.c	Wed Dec 15 20:08:01 2004 +0000
+++ b/network.c	Wed Dec 15 20:10:34 2004 +0000
@@ -871,6 +871,10 @@
 	IConsoleCmdExec("exec scripts/on_server.scr 0");
 	// if the server is dedicated ... add some other script
 	if (_network_dedicated) IConsoleCmdExec("exec scripts/on_dedicated.scr 0");
+
+	/* Try to register us to the master server */
+	_network_last_advertise_date = 0;
+	NetworkUDPAdvertise();
 	return true;
 }
 
@@ -1163,6 +1167,8 @@
 	// Network is available
 	_network_available = true;
 	_network_dedicated = false;
+	_network_advertise = false;
+	_network_last_advertise_date = 0;
 
 	/* Load the ip from the openttd.cfg */
 	_network_server_bind_ip = inet_addr(_network_server_bind_ip_host);
--- a/network.h	Wed Dec 15 20:08:01 2004 +0000
+++ b/network.h	Wed Dec 15 20:10:34 2004 +0000
@@ -28,6 +28,11 @@
 // Do not change this next line. It should _ALWAYS_ be MAX_CLIENTS + 1
 #define MAX_CLIENT_INFO (MAX_CLIENTS + 1)
 
+/* Stuff for the master-server */
+#define NETWORK_MASTER_SERVER_PORT 3978
+#define NETWORK_MASTER_SERVER_HOST "master.openttd.org"
+#define NETWORK_MASTER_SERVER_WELCOME_MESSAGE "OpenTTDRegister"
+
 #define NETWORK_DEFAULT_PORT 3979
 
 #define MAX_INTERFACES 9
@@ -166,6 +171,9 @@
 VARDEF bool _network_udp_server;
 VARDEF uint16 _network_udp_broadcast;
 
+VARDEF bool _network_advertise;
+VARDEF uint16 _network_last_advertise_date;
+
 #endif /* ENABLE_NETWORK */
 
 // Those variables must always be registered!
--- a/network_data.h	Wed Dec 15 20:08:01 2004 +0000
+++ b/network_data.h	Wed Dec 15 20:10:34 2004 +0000
@@ -18,6 +18,8 @@
 #define NETWORK_GAME_INFO_VERSION 1
 // What version of company info is this?
 #define NETWORK_COMPANY_INFO_VERSION 1
+// What version of master-server-protocol do we use?
+#define NETWORK_MASTER_SERVER_VERSION 1
 
 typedef uint16 PacketSize;
 
--- a/network_server.c	Wed Dec 15 20:08:01 2004 +0000
+++ b/network_server.c	Wed Dec 15 20:10:34 2004 +0000
@@ -5,6 +5,7 @@
 
 #include "table/strings.h"
 #include "network_server.h"
+#include "network_udp.h"
 #include "console.h"
 #include "command.h"
 #include "gfx.h"
@@ -1198,7 +1199,7 @@
 		if (ci != NULL && ci->client_playas > 0 && ci->client_playas <= MAX_PLAYERS) {
 			if (strlen(_network_player_info[ci->client_playas-1].players) != 0)
 				strncat(_network_player_info[ci->client_playas-1].players, ", ", sizeof(_network_player_info[ci->client_playas-1].players));
-				
+
 			strncat(_network_player_info[ci->client_playas-1].players, client_name, sizeof(_network_player_info[ci->client_playas-1].players));
 		}
 	}
@@ -1372,6 +1373,9 @@
 		last_sync_frame = _frame_counter;
 	}
 #endif
+
+	/* See if we need to advertise */
+	NetworkUDPAdvertise();
 }
 
 #endif /* ENABLE_NETWORK */
--- a/network_udp.c	Wed Dec 15 20:08:01 2004 +0000
+++ b/network_udp.c	Wed Dec 15 20:10:34 2004 +0000
@@ -19,6 +19,7 @@
 	PACKET_UDP_SERVER_RESPONSE,
 	PACKET_UDP_CLIENT_DETAIL_INFO,
 	PACKET_UDP_SERVER_DETAIL_INFO, // Is not used in OpenTTD itself, only for external querying
+	PACKET_UDP_SERVER_REGISTER, // Packet to register itself to the master server
 	PACKET_UDP_END
 } PacketUDPType;
 
@@ -218,6 +219,7 @@
 	RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE),
 	RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO),
 	NULL,
+	NULL,
 };
 
 // If this fails, check the array above with network_data.h
@@ -467,6 +469,39 @@
 	UpdateNetworkGameWindow(false);
 }
 
+/* Register us to the master server
+     This function checks if it needs to send an advertise */
+void NetworkUDPAdvertise()
+{
+	struct sockaddr_in out_addr;
+	Packet *p;
+
+	/* Check if we should send an advertise */
+	if (!_networking || !_network_server || !_network_udp_server || !_network_advertise)
+		return;
+
+	/* Only send once in the 450 game-days (about 15 minutes) */
+	if (_network_last_advertise_date + 450 > _date)
+		return;
+	_network_last_advertise_date = _date;
+
+	/* Find somewhere to send */
+	out_addr.sin_family = AF_INET;
+	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
+	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
+
+	DEBUG(net, 1)("[NET][UDP] Advertising to master server");
+
+	/* Send the packet */
+	p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER);
+	/* Packet is: WELCOME_MESSAGE, Version, server_port */
+	NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE);
+	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
+	NetworkSend_uint16(p, _network_server_port);
+	NetworkSendUDP_Packet(p, &out_addr);
+	free(p);
+}
+
 void NetworkUDPInitialize(void)
 {
 	_udp_client_socket = INVALID_SOCKET;
--- a/network_udp.h	Wed Dec 15 20:08:01 2004 +0000
+++ b/network_udp.h	Wed Dec 15 20:10:34 2004 +0000
@@ -6,5 +6,6 @@
 void NetworkUDPReceive(void);
 void NetworkUDPSearchGame(void);
 void NetworkUDPQueryServer(const byte* host, unsigned short port);
+void NetworkUDPAdvertise();
 
 #endif /* NETWORK_LAN_H */