src/network/network_udp.c
branchcustombridgeheads
changeset 5648 1608018c5ff2
parent 5643 3778051e8095
--- 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