--- 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