network_udp.c
changeset 668 1fe298df8526
parent 638 cb9f5f50d3c7
child 716 8af847728d5b
equal deleted inserted replaced
667:c6484d63bbe4 668:1fe298df8526
    17 typedef enum {
    17 typedef enum {
    18 	PACKET_UDP_CLIENT_FIND_SERVER,
    18 	PACKET_UDP_CLIENT_FIND_SERVER,
    19 	PACKET_UDP_SERVER_RESPONSE,
    19 	PACKET_UDP_SERVER_RESPONSE,
    20 	PACKET_UDP_CLIENT_DETAIL_INFO,
    20 	PACKET_UDP_CLIENT_DETAIL_INFO,
    21 	PACKET_UDP_SERVER_DETAIL_INFO, // Is not used in OpenTTD itself, only for external querying
    21 	PACKET_UDP_SERVER_DETAIL_INFO, // Is not used in OpenTTD itself, only for external querying
       
    22 	PACKET_UDP_SERVER_REGISTER, // Packet to register itself to the master server
    22 	PACKET_UDP_END
    23 	PACKET_UDP_END
    23 } PacketUDPType;
    24 } PacketUDPType;
    24 
    25 
    25 static SOCKET _udp_server_socket; // udp server socket
    26 static SOCKET _udp_server_socket; // udp server socket
    26 
    27 
   216 static NetworkUDPPacket* const _network_udp_packet[] = {
   217 static NetworkUDPPacket* const _network_udp_packet[] = {
   217 	RECEIVE_COMMAND(PACKET_UDP_CLIENT_FIND_SERVER),
   218 	RECEIVE_COMMAND(PACKET_UDP_CLIENT_FIND_SERVER),
   218 	RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE),
   219 	RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE),
   219 	RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO),
   220 	RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO),
   220 	NULL,
   221 	NULL,
       
   222 	NULL,
   221 };
   223 };
   222 
   224 
   223 // If this fails, check the array above with network_data.h
   225 // If this fails, check the array above with network_data.h
   224 assert_compile(lengthof(_network_udp_packet) == PACKET_UDP_END);
   226 assert_compile(lengthof(_network_udp_packet) == PACKET_UDP_END);
   225 
   227 
   465 	free(p);
   467 	free(p);
   466 
   468 
   467 	UpdateNetworkGameWindow(false);
   469 	UpdateNetworkGameWindow(false);
   468 }
   470 }
   469 
   471 
       
   472 /* Register us to the master server
       
   473      This function checks if it needs to send an advertise */
       
   474 void NetworkUDPAdvertise()
       
   475 {
       
   476 	struct sockaddr_in out_addr;
       
   477 	Packet *p;
       
   478 
       
   479 	/* Check if we should send an advertise */
       
   480 	if (!_networking || !_network_server || !_network_udp_server || !_network_advertise)
       
   481 		return;
       
   482 
       
   483 	/* Only send once in the 450 game-days (about 15 minutes) */
       
   484 	if (_network_last_advertise_date + 450 > _date)
       
   485 		return;
       
   486 	_network_last_advertise_date = _date;
       
   487 
       
   488 	/* Find somewhere to send */
       
   489 	out_addr.sin_family = AF_INET;
       
   490 	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
       
   491 	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
       
   492 
       
   493 	DEBUG(net, 1)("[NET][UDP] Advertising to master server");
       
   494 
       
   495 	/* Send the packet */
       
   496 	p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER);
       
   497 	/* Packet is: WELCOME_MESSAGE, Version, server_port */
       
   498 	NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE);
       
   499 	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
       
   500 	NetworkSend_uint16(p, _network_server_port);
       
   501 	NetworkSendUDP_Packet(p, &out_addr);
       
   502 	free(p);
       
   503 }
       
   504 
   470 void NetworkUDPInitialize(void)
   505 void NetworkUDPInitialize(void)
   471 {
   506 {
   472 	_udp_client_socket = INVALID_SOCKET;
   507 	_udp_client_socket = INVALID_SOCKET;
   473 	_udp_server_socket = INVALID_SOCKET;
   508 	_udp_server_socket = INVALID_SOCKET;
   474 
   509