diff -r cbde85c8c878 -r 1608018c5ff2 src/network/network_udp.c --- a/src/network/network_udp.c Wed Jan 03 20:00:29 2007 +0000 +++ b/src/network/network_udp.c Thu Jan 11 13:16:26 2007 +0000 @@ -28,7 +28,7 @@ ADVERTISE_RETRY_TIMES = 3 // give up readvertising after this much failed retries }; -#define DEF_UDP_RECEIVE_COMMAND(type) void NetworkPacketReceive_ ## type ## _command(Packet *p, struct sockaddr_in *client_addr) +#define DEF_UDP_RECEIVE_COMMAND(type) void NetworkPacketReceive_ ## type ## _command(Packet *p, const struct sockaddr_in *client_addr) static NetworkClientState _udp_cs; @@ -50,7 +50,7 @@ _network_game_info.spectators_on = NetworkSpectatorCount(); _network_game_info.grfconfig = _grfconfig; - NetworkSend_NetworkGameInfo(p, &_network_game_info); + NetworkSend_NetworkGameInfo(packet, &_network_game_info); // Let the client know that we are here NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr); @@ -397,30 +397,31 @@ } } - -// The layout for the receive-functions by UDP -typedef void NetworkUDPPacket(Packet *p, struct sockaddr_in *client_addr); +/** + * Every type of UDP packet should only be received by a single socket; + * The socket communicating with the masterserver should receive the + * game information of some 'random' host. + */ +typedef struct NetworkUDPPacketAndSocket { + void (*callback)(Packet *p, const struct sockaddr_in *client_addr); + SOCKET *incoming_socket; +} NetworkUPDPacketAndSocket; -static NetworkUDPPacket* const _network_udp_packet[] = { - RECEIVE_COMMAND(PACKET_UDP_CLIENT_FIND_SERVER), - RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE), - RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO), - NULL, - NULL, - RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER), - NULL, - RECEIVE_COMMAND(PACKET_UDP_MASTER_RESPONSE_LIST), - NULL, - RECEIVE_COMMAND(PACKET_UDP_CLIENT_GET_NEWGRFS), - RECEIVE_COMMAND(PACKET_UDP_SERVER_NEWGRFS), +static const NetworkUPDPacketAndSocket _network_udp_packet[PACKET_UDP_END] = { + { RECEIVE_COMMAND(PACKET_UDP_CLIENT_FIND_SERVER), &_udp_server_socket }, + { RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE), &_udp_client_socket }, + { RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO), &_udp_server_socket }, + { NULL, NULL }, + { NULL, NULL }, + { RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER), &_udp_master_socket }, + { NULL, NULL }, + { RECEIVE_COMMAND(PACKET_UDP_MASTER_RESPONSE_LIST), &_udp_client_socket }, + { NULL, NULL }, + { RECEIVE_COMMAND(PACKET_UDP_CLIENT_GET_NEWGRFS), &_udp_server_socket }, + { RECEIVE_COMMAND(PACKET_UDP_SERVER_NEWGRFS), &_udp_client_socket }, }; - -// If this fails, check the array above with network_data.h -assert_compile(lengthof(_network_udp_packet) == PACKET_UDP_END); - - -void NetworkHandleUDPPacket(Packet *p, struct sockaddr_in *client_addr) +void NetworkHandleUDPPacket(const SOCKET udp, Packet *p, const struct sockaddr_in *client_addr) { byte type; @@ -430,43 +431,34 @@ type = NetworkRecv_uint8(&_udp_cs, p); - if (type < PACKET_UDP_END && _network_udp_packet[type] != NULL && !_udp_cs.has_quit) { - _network_udp_packet[type](p, client_addr); + if (type < PACKET_UDP_END && *_network_udp_packet[type].incoming_socket == udp && !_udp_cs.has_quit) { + _network_udp_packet[type].callback(p, client_addr); } else { - if (!_udp_cs.has_quit) { - DEBUG(net, 0, "[udp] received invalid packet type %d", type); + if (*_network_udp_packet[type].incoming_socket != udp) { + DEBUG(net, 0, "[udp] received packet on wrong port from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); + } else if (!_udp_cs.has_quit) { + DEBUG(net, 0, "[udp] received invalid packet type %d from %s:%d", type, inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); } else { - DEBUG(net, 0, "[udp] received illegal packet"); + DEBUG(net, 0, "[udp] received illegal packet from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); } } } // Close UDP connection -void NetworkUDPClose(void) +void NetworkUDPStop(void) { DEBUG(net, 1, "[udp] closed listeners"); if (_network_udp_server) { - if (_udp_server_socket != INVALID_SOCKET) { - closesocket(_udp_server_socket); - _udp_server_socket = INVALID_SOCKET; - } + NetworkUDPClose(&_udp_server_socket); + NetworkUDPClose(&_udp_master_socket); + } else { + NetworkUDPClose(&_udp_client_socket); + } - if (_udp_master_socket != INVALID_SOCKET) { - closesocket(_udp_master_socket); - _udp_master_socket = INVALID_SOCKET; - } - - _network_udp_server = false; - _network_udp_broadcast = 0; - } else { - if (_udp_client_socket != INVALID_SOCKET) { - closesocket(_udp_client_socket); - _udp_client_socket = INVALID_SOCKET; - } - _network_udp_broadcast = 0; - } + _network_udp_server = false; + _network_udp_broadcast = 0; } // Broadcast to all ips