--- 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;