network_udp.c
changeset 668 346853c8b513
parent 638 a26f83ba23f3
child 716 40a349345f82
--- 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;