137 // Let the client know that we are here |
137 // Let the client know that we are here |
138 NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr); |
138 NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr); |
139 |
139 |
140 free(packet); |
140 free(packet); |
141 |
141 |
142 DEBUG(net, 2)("[NET][UDP] Queried from %s", inet_ntoa(client_addr->sin_addr)); |
142 DEBUG(net, 2, "[udp] queried from '%s'", inet_ntoa(client_addr->sin_addr)); |
143 } |
143 } |
144 |
144 |
145 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE) |
145 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE) |
146 { |
146 { |
147 extern const char _openttd_revision[]; |
147 extern const char _openttd_revision[]; |
154 |
154 |
155 game_info_version = NetworkRecv_uint8(&_udp_cs, p); |
155 game_info_version = NetworkRecv_uint8(&_udp_cs, p); |
156 |
156 |
157 if (_udp_cs.has_quit) return; |
157 if (_udp_cs.has_quit) return; |
158 |
158 |
159 DEBUG(net, 6)("[NET][UDP] Server response from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); |
159 DEBUG(net, 4, "[udp] server response from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); |
160 |
160 |
161 // Find next item |
161 // Find next item |
162 item = NetworkGameListAddItem(inet_addr(inet_ntoa(client_addr->sin_addr)), ntohs(client_addr->sin_port)); |
162 item = NetworkGameListAddItem(inet_addr(inet_ntoa(client_addr->sin_addr)), ntohs(client_addr->sin_port)); |
163 |
163 |
164 item->info.compatible = true; |
164 item->info.compatible = true; |
412 } |
412 } |
413 |
413 |
414 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER) |
414 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER) |
415 { |
415 { |
416 _network_advertise_retries = 0; |
416 _network_advertise_retries = 0; |
417 DEBUG(net, 2)("[NET][UDP] We are advertised on the master-server!"); |
417 DEBUG(net, 2, "[udp] advertising on master server successfull"); |
418 |
418 |
419 if (!_network_advertise) { |
419 /* We are advertised, but we don't want to! */ |
420 /* We are advertised, but we don't want to! */ |
420 if (!_network_advertise) NetworkUDPRemoveAdvertise(); |
421 NetworkUDPRemoveAdvertise(); |
|
422 } |
|
423 } |
421 } |
424 |
422 |
425 /** |
423 /** |
426 * A client has requested the names of some NewGRFs. |
424 * A client has requested the names of some NewGRFs. |
427 * |
425 * |
446 uint packet_len = 0; |
444 uint packet_len = 0; |
447 |
445 |
448 /* Just a fail-safe.. should never happen */ |
446 /* Just a fail-safe.. should never happen */ |
449 if (_udp_cs.has_quit) return; |
447 if (_udp_cs.has_quit) return; |
450 |
448 |
451 DEBUG(net, 6)("[NET][UDP] NewGRF data request from %s:%d", inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port)); |
449 DEBUG(net, 6, "[udp] newgrf data request from %s:%d", inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port)); |
452 |
450 |
453 num_grfs = NetworkRecv_uint8 (&_udp_cs, p); |
451 num_grfs = NetworkRecv_uint8 (&_udp_cs, p); |
454 if (num_grfs > NETWORK_MAX_GRF_COUNT) return; |
452 if (num_grfs > NETWORK_MAX_GRF_COUNT) return; |
455 |
453 |
456 for (i = 0; i < num_grfs; i++) { |
454 for (i = 0; i < num_grfs; i++) { |
500 uint i; |
498 uint i; |
501 |
499 |
502 /* Just a fail-safe.. should never happen */ |
500 /* Just a fail-safe.. should never happen */ |
503 if (_udp_cs.has_quit) return; |
501 if (_udp_cs.has_quit) return; |
504 |
502 |
505 DEBUG(net, 6)("[NET][UDP] NewGRF data reply from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); |
503 DEBUG(net, 6, "[udp] newgrf data reply from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); |
506 |
504 |
507 num_grfs = NetworkRecv_uint8 (&_udp_cs, p); |
505 num_grfs = NetworkRecv_uint8 (&_udp_cs, p); |
508 if (num_grfs > NETWORK_MAX_GRF_COUNT) return; |
506 if (num_grfs > NETWORK_MAX_GRF_COUNT) return; |
509 |
507 |
510 for (i = 0; i < num_grfs; i++) { |
508 for (i = 0; i < num_grfs; i++) { |
564 |
562 |
565 if (type < PACKET_UDP_END && _network_udp_packet[type] != NULL && !_udp_cs.has_quit) { |
563 if (type < PACKET_UDP_END && _network_udp_packet[type] != NULL && !_udp_cs.has_quit) { |
566 _network_udp_packet[type](p, client_addr); |
564 _network_udp_packet[type](p, client_addr); |
567 } else { |
565 } else { |
568 if (!_udp_cs.has_quit) { |
566 if (!_udp_cs.has_quit) { |
569 DEBUG(net, 0)("[NET][UDP] Received invalid packet type %d", type); |
567 DEBUG(net, 0, "[udp] received invalid packet type %d", type); |
570 } else { |
568 } else { |
571 DEBUG(net, 0)("[NET][UDP] Received illegal packet"); |
569 DEBUG(net, 0, "[udp] received illegal packet"); |
572 } |
570 } |
573 } |
571 } |
574 } |
572 } |
575 |
573 |
576 |
574 |
584 p->buffer[1] = p->size >> 8; |
582 p->buffer[1] = p->size >> 8; |
585 |
583 |
586 // Send the buffer |
584 // Send the buffer |
587 res = sendto(udp, p->buffer, p->size, 0, (struct sockaddr *)recv, sizeof(*recv)); |
585 res = sendto(udp, p->buffer, p->size, 0, (struct sockaddr *)recv, sizeof(*recv)); |
588 |
586 |
589 // Check for any errors, but ignore it for the rest |
587 // Check for any errors, but ignore it otherwise |
590 if (res == -1) { |
588 if (res == -1) DEBUG(net, 1, "[udp] sendto failed with: %i", GET_LAST_ERROR()); |
591 DEBUG(net, 1)("[NET][UDP] Send error: %i", GET_LAST_ERROR()); |
|
592 } |
|
593 } |
589 } |
594 |
590 |
595 // Start UDP listener |
591 // Start UDP listener |
596 bool NetworkUDPListen(SOCKET *udp, uint32 host, uint16 port, bool broadcast) |
592 bool NetworkUDPListen(SOCKET *udp, uint32 host, uint16 port, bool broadcast) |
597 { |
593 { |
600 // Make sure socket is closed |
596 // Make sure socket is closed |
601 closesocket(*udp); |
597 closesocket(*udp); |
602 |
598 |
603 *udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
599 *udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
604 if (*udp == INVALID_SOCKET) { |
600 if (*udp == INVALID_SOCKET) { |
605 DEBUG(net, 1)("[NET][UDP] Failed to start UDP support"); |
601 DEBUG(net, 0, "[udp] failed to start UDP listener"); |
606 return false; |
602 return false; |
607 } |
603 } |
608 |
604 |
609 // set nonblocking mode for socket |
605 // set nonblocking mode for socket |
610 { |
606 { |
620 // Listen on all IPs |
616 // Listen on all IPs |
621 sin.sin_addr.s_addr = host; |
617 sin.sin_addr.s_addr = host; |
622 sin.sin_port = htons(port); |
618 sin.sin_port = htons(port); |
623 |
619 |
624 if (bind(*udp, (struct sockaddr*)&sin, sizeof(sin)) != 0) { |
620 if (bind(*udp, (struct sockaddr*)&sin, sizeof(sin)) != 0) { |
625 DEBUG(net, 1) ("[NET][UDP] error: bind failed on %s:%i", inet_ntoa(*(struct in_addr *)&host), port); |
621 DEBUG(net, 0, "[udp] bind failed on %s:%i", inet_ntoa(*(struct in_addr *)&host), port); |
626 return false; |
622 return false; |
627 } |
623 } |
628 |
624 |
629 if (broadcast) { |
625 if (broadcast) { |
630 /* Enable broadcast */ |
626 /* Enable broadcast */ |
632 #ifndef BEOS_NET_SERVER // will work around this, some day; maybe. |
628 #ifndef BEOS_NET_SERVER // will work around this, some day; maybe. |
633 setsockopt(*udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val)); |
629 setsockopt(*udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val)); |
634 #endif |
630 #endif |
635 } |
631 } |
636 |
632 |
637 DEBUG(net, 1)("[NET][UDP] Listening on port %s:%d", inet_ntoa(*(struct in_addr *)&host), port); |
633 DEBUG(net, 1, "[udp] listening on port %s:%d", inet_ntoa(*(struct in_addr *)&host), port); |
638 |
634 |
639 return true; |
635 return true; |
640 } |
636 } |
641 |
637 |
642 // Close UDP connection |
638 // Close UDP connection |
643 void NetworkUDPClose(void) |
639 void NetworkUDPClose(void) |
644 { |
640 { |
645 DEBUG(net, 1) ("[NET][UDP] Closed listeners"); |
641 DEBUG(net, 1, "[udp] closed listeners"); |
646 |
642 |
647 if (_network_udp_server) { |
643 if (_network_udp_server) { |
648 if (_udp_server_socket != INVALID_SOCKET) { |
644 if (_udp_server_socket != INVALID_SOCKET) { |
649 closesocket(_udp_server_socket); |
645 closesocket(_udp_server_socket); |
650 _udp_server_socket = INVALID_SOCKET; |
646 _udp_server_socket = INVALID_SOCKET; |
713 |
709 |
714 out_addr.sin_family = AF_INET; |
710 out_addr.sin_family = AF_INET; |
715 out_addr.sin_port = htons(_network_server_port); |
711 out_addr.sin_port = htons(_network_server_port); |
716 out_addr.sin_addr.s_addr = _broadcast_list[i]; |
712 out_addr.sin_addr.s_addr = _broadcast_list[i]; |
717 |
713 |
718 DEBUG(net, 6)("[NET][UDP] Broadcasting to %s", inet_ntoa(out_addr.sin_addr)); |
714 DEBUG(net, 4, "[udp] broadcasting to %s", inet_ntoa(out_addr.sin_addr)); |
719 |
715 |
720 NetworkSendUDP_Packet(udp, p, &out_addr); |
716 NetworkSendUDP_Packet(udp, p, &out_addr); |
721 } |
717 } |
722 |
718 |
723 free(p); |
719 free(p); |
743 // packet only contains protocol version |
739 // packet only contains protocol version |
744 NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION); |
740 NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION); |
745 |
741 |
746 NetworkSendUDP_Packet(_udp_client_socket, p, &out_addr); |
742 NetworkSendUDP_Packet(_udp_client_socket, p, &out_addr); |
747 |
743 |
748 DEBUG(net, 2)("[NET][UDP] Queried Master Server at %s:%d", inet_ntoa(out_addr.sin_addr),ntohs(out_addr.sin_port)); |
744 DEBUG(net, 2, "[udp] master server queried at %s:%d", inet_ntoa(out_addr.sin_addr),ntohs(out_addr.sin_port)); |
749 |
745 |
750 free(p); |
746 free(p); |
751 } |
747 } |
752 |
748 |
753 // Find all servers |
749 // Find all servers |
754 void NetworkUDPSearchGame(void) |
750 void NetworkUDPSearchGame(void) |
755 { |
751 { |
756 // We are still searching.. |
752 // We are still searching.. |
757 if (_network_udp_broadcast > 0) |
753 if (_network_udp_broadcast > 0) return; |
758 return; |
|
759 |
754 |
760 // No UDP-socket yet.. |
755 // No UDP-socket yet.. |
761 if (_udp_client_socket == INVALID_SOCKET) |
756 if (_udp_client_socket == INVALID_SOCKET) |
762 if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true)) |
757 if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true)) |
763 return; |
758 return; |
764 |
759 |
765 DEBUG(net, 0)("[NET][UDP] Searching server"); |
760 DEBUG(net, 0, "[udp] searching server"); |
766 |
761 |
767 NetworkUDPBroadCast(_udp_client_socket); |
762 NetworkUDPBroadCast(_udp_client_socket); |
768 _network_udp_broadcast = 300; // Stay searching for 300 ticks |
763 _network_udp_broadcast = 300; // Stay searching for 300 ticks |
769 } |
764 } |
770 |
765 |
806 { |
801 { |
807 struct sockaddr_in out_addr; |
802 struct sockaddr_in out_addr; |
808 Packet *p; |
803 Packet *p; |
809 |
804 |
810 /* Check if we are advertising */ |
805 /* Check if we are advertising */ |
811 if (!_networking || !_network_server || !_network_udp_server) |
806 if (!_networking || !_network_server || !_network_udp_server) return; |
812 return; |
|
813 |
807 |
814 /* check for socket */ |
808 /* check for socket */ |
815 if (_udp_master_socket == INVALID_SOCKET) |
809 if (_udp_master_socket == INVALID_SOCKET) |
816 if (!NetworkUDPListen(&_udp_master_socket, _network_server_bind_ip, 0, false)) |
810 if (!NetworkUDPListen(&_udp_master_socket, _network_server_bind_ip, 0, false)) |
817 return; |
811 return; |
818 |
812 |
819 DEBUG(net, 2)("[NET][UDP] Removing advertise.."); |
813 DEBUG(net, 1, "[udp] removing advertise from master server"); |
820 |
814 |
821 /* Find somewhere to send */ |
815 /* Find somewhere to send */ |
822 out_addr.sin_family = AF_INET; |
816 out_addr.sin_family = AF_INET; |
823 out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT); |
817 out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT); |
824 out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST); |
818 out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST); |
870 /* Find somewhere to send */ |
864 /* Find somewhere to send */ |
871 out_addr.sin_family = AF_INET; |
865 out_addr.sin_family = AF_INET; |
872 out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT); |
866 out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT); |
873 out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST); |
867 out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST); |
874 |
868 |
875 DEBUG(net, 1)("[NET][UDP] Advertising to master server"); |
869 DEBUG(net, 1, "[udp] advertising to master server"); |
876 |
870 |
877 /* Send the packet */ |
871 /* Send the packet */ |
878 p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER); |
872 p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER); |
879 /* Packet is: WELCOME_MESSAGE, Version, server_port */ |
873 /* Packet is: WELCOME_MESSAGE, Version, server_port */ |
880 NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE); |
874 NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE); |