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 |