src/network/network_udp.c
author celestar
Thu, 11 Jan 2007 13:16:26 +0000
branchcustombridgeheads
changeset 5648 1608018c5ff2
parent 5643 3778051e8095
permissions -rw-r--r--
(svn r8059) [cbh] - Sync with r7788:8032 from trunk
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     1
/* $Id$ */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     2
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     3
#ifdef ENABLE_NETWORK
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     4
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     5
#include "../stdafx.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     6
#include "../debug.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     7
#include "../string.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     8
#include "network_data.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
     9
#include "../date.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    10
#include "../map.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    11
#include "network_gamelist.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    12
#include "network_udp.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    13
#include "../variables.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    14
#include "../newgrf_config.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    15
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    16
#include "core/udp.h"
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    17
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    18
/**
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    19
 * @file network_udp.c This file handles the UDP related communication.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    20
 *
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    21
 * This is the GameServer <-> MasterServer and GameServer <-> GameClient
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    22
 * communication before the game is being joined.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    23
 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    24
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    25
enum {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    26
	ADVERTISE_NORMAL_INTERVAL = 30000, // interval between advertising in ticks (15 minutes)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    27
	ADVERTISE_RETRY_INTERVAL  =   300, // readvertise when no response after this many ticks (9 seconds)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    28
	ADVERTISE_RETRY_TIMES     =     3  // give up readvertising after this much failed retries
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    29
};
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    30
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
    31
#define DEF_UDP_RECEIVE_COMMAND(type) void NetworkPacketReceive_ ## type ## _command(Packet *p, const struct sockaddr_in *client_addr)
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    32
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    33
static NetworkClientState _udp_cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    34
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    35
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_CLIENT_FIND_SERVER)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    36
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    37
	Packet *packet;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    38
	// Just a fail-safe.. should never happen
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    39
	if (!_network_udp_server)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    40
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    41
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    42
	packet = NetworkSend_Init(PACKET_UDP_SERVER_RESPONSE);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    43
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    44
	// Update some game_info
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    45
	_network_game_info.game_date     = _date;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    46
	_network_game_info.map_width     = MapSizeX();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    47
	_network_game_info.map_height    = MapSizeY();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    48
	_network_game_info.map_set       = _opt.landscape;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    49
	_network_game_info.companies_on  = ActivePlayerCount();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    50
	_network_game_info.spectators_on = NetworkSpectatorCount();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    51
	_network_game_info.grfconfig     = _grfconfig;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    52
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
    53
	NetworkSend_NetworkGameInfo(packet, &_network_game_info);
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    54
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    55
	// Let the client know that we are here
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    56
	NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    57
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    58
	free(packet);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    59
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    60
	DEBUG(net, 2, "[udp] queried from '%s'", inet_ntoa(client_addr->sin_addr));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    61
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    62
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    63
void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    64
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    65
	/* Find the matching GRF file */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    66
	const GRFConfig *f = FindGRFConfig(config->grfid, config->md5sum);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    67
	if (f == NULL) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    68
		/* Don't know the GRF, so mark game incompatible and the (possibly)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    69
		 * already resolved name for this GRF (another server has sent the
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    70
		 * name of the GRF already */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    71
		config->name     = FindUnknownGRFName(config->grfid, config->md5sum, true);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    72
		SETBIT(config->flags, GCF_NOT_FOUND);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    73
	} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    74
		config->filename = f->filename;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    75
		config->name     = f->name;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    76
		config->info     = f->info;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    77
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    78
	SETBIT(config->flags, GCF_COPY);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    79
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    80
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    81
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    82
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    83
	extern const char _openttd_revision[];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    84
	NetworkGameList *item;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    85
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    86
	// Just a fail-safe.. should never happen
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    87
	if (_network_udp_server || _udp_cs.has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    88
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    89
	DEBUG(net, 4, "[udp] server response from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    90
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    91
	// Find next item
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    92
	item = NetworkGameListAddItem(inet_addr(inet_ntoa(client_addr->sin_addr)), ntohs(client_addr->sin_port));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    93
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    94
	NetworkRecv_NetworkGameInfo(&_udp_cs, p, &item->info);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    95
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    96
	item->info.compatible = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    97
	{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    98
		/* Checks whether there needs to be a request for names of GRFs and makes
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
    99
		 * the request if necessary. GRFs that need to be requested are the GRFs
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   100
		 * that do not exist on the clients system and we do not have the name
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   101
		 * resolved of, i.e. the name is still UNKNOWN_GRF_NAME_PLACEHOLDER.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   102
		 * The in_request array and in_request_count are used so there is no need
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   103
		 * to do a second loop over the GRF list, which can be relatively expensive
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   104
		 * due to the string comparisons. */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   105
		const GRFConfig *in_request[NETWORK_MAX_GRF_COUNT];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   106
		const GRFConfig *c;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   107
		uint in_request_count = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   108
		struct sockaddr_in out_addr;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   109
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   110
		for (c = item->info.grfconfig; c != NULL; c = c->next) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   111
			if (HASBIT(c->flags, GCF_NOT_FOUND)) item->info.compatible = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   112
			if (!HASBIT(c->flags, GCF_NOT_FOUND) || strcmp(c->name, UNKNOWN_GRF_NAME_PLACEHOLDER) != 0) continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   113
			in_request[in_request_count] = c;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   114
			in_request_count++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   115
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   116
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   117
		if (in_request_count > 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   118
			/* There are 'unknown' GRFs, now send a request for them */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   119
			uint i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   120
			Packet *packet = NetworkSend_Init(PACKET_UDP_CLIENT_GET_NEWGRFS);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   121
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   122
			NetworkSend_uint8 (packet, in_request_count);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   123
			for (i = 0; i < in_request_count; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   124
				NetworkSend_GRFIdentifier(packet, in_request[i]);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   125
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   126
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   127
			out_addr.sin_family      = AF_INET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   128
			out_addr.sin_port        = htons(item->port);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   129
			out_addr.sin_addr.s_addr = item->ip;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   130
			NetworkSendUDP_Packet(_udp_client_socket, packet, &out_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   131
			free(packet);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   132
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   133
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   134
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   135
	if (item->info.server_lang >= NETWORK_NUM_LANGUAGES) item->info.server_lang = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   136
	if (item->info.map_set >= NUM_LANDSCAPE ) item->info.map_set = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   137
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   138
	if (item->info.hostname[0] == '\0')
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   139
		snprintf(item->info.hostname, sizeof(item->info.hostname), "%s", inet_ntoa(client_addr->sin_addr));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   140
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   141
	/* Check if we are allowed on this server based on the revision-match */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   142
	item->info.version_compatible =
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   143
		strcmp(item->info.server_revision, _openttd_revision) == 0 ||
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   144
		strcmp(item->info.server_revision, NOREV_STRING) == 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   145
	item->info.compatible &= item->info.version_compatible; // Already contains match for GRFs
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   146
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   147
	item->online = true;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   148
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   149
	UpdateNetworkGameWindow(false);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   150
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   151
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   152
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   153
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   154
	NetworkClientState *cs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   155
	NetworkClientInfo *ci;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   156
	Packet *packet;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   157
	Player *player;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   158
	byte current = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   159
	int i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   160
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   161
	// Just a fail-safe.. should never happen
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   162
	if (!_network_udp_server) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   163
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   164
	packet = NetworkSend_Init(PACKET_UDP_SERVER_DETAIL_INFO);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   165
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   166
	/* Send the amount of active companies */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   167
	NetworkSend_uint8 (packet, NETWORK_COMPANY_INFO_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   168
	NetworkSend_uint8 (packet, ActivePlayerCount());
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   169
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   170
	/* Fetch the latest version of everything */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   171
	NetworkPopulateCompanyInfo();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   172
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   173
	/* Go through all the players */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   174
	FOR_ALL_PLAYERS(player) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   175
		/* Skip non-active players */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   176
		if (!player->is_active) continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   177
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   178
		current++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   179
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   180
		/* Send the information */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   181
		NetworkSend_uint8(packet, current);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   182
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   183
		NetworkSend_string(packet, _network_player_info[player->index].company_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   184
		NetworkSend_uint32(packet, _network_player_info[player->index].inaugurated_year);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   185
		NetworkSend_uint64(packet, _network_player_info[player->index].company_value);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   186
		NetworkSend_uint64(packet, _network_player_info[player->index].money);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   187
		NetworkSend_uint64(packet, _network_player_info[player->index].income);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   188
		NetworkSend_uint16(packet, _network_player_info[player->index].performance);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   189
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   190
		/* Send 1 if there is a passord for the company else send 0 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   191
		if (_network_player_info[player->index].password[0] != '\0') {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   192
			NetworkSend_uint8(packet, 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   193
		} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   194
			NetworkSend_uint8(packet, 0);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   195
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   196
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   197
		for (i = 0; i < NETWORK_VEHICLE_TYPES; i++)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   198
			NetworkSend_uint16(packet, _network_player_info[player->index].num_vehicle[i]);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   199
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   200
		for (i = 0; i < NETWORK_STATION_TYPES; i++)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   201
			NetworkSend_uint16(packet, _network_player_info[player->index].num_station[i]);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   202
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   203
		/* Find the clients that are connected to this player */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   204
		FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   205
			ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   206
			if (ci->client_playas == player->index) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   207
				/* The uint8 == 1 indicates that a client is following */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   208
				NetworkSend_uint8(packet, 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   209
				NetworkSend_string(packet, ci->client_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   210
				NetworkSend_string(packet, ci->unique_id);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   211
				NetworkSend_uint32(packet, ci->join_date);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   212
			}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   213
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   214
		/* Also check for the server itself */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   215
		ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   216
		if (ci->client_playas == player->index) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   217
			/* The uint8 == 1 indicates that a client is following */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   218
			NetworkSend_uint8(packet, 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   219
			NetworkSend_string(packet, ci->client_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   220
			NetworkSend_string(packet, ci->unique_id);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   221
			NetworkSend_uint32(packet, ci->join_date);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   222
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   223
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   224
		/* Indicates end of client list */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   225
		NetworkSend_uint8(packet, 0);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   226
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   227
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   228
	/* And check if we have any spectators */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   229
	FOR_ALL_CLIENTS(cs) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   230
		ci = DEREF_CLIENT_INFO(cs);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   231
		if (!IsValidPlayer(ci->client_playas)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   232
			/* The uint8 == 1 indicates that a client is following */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   233
			NetworkSend_uint8(packet, 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   234
			NetworkSend_string(packet, ci->client_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   235
			NetworkSend_string(packet, ci->unique_id);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   236
			NetworkSend_uint32(packet, ci->join_date);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   237
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   238
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   239
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   240
	/* Also check for the server itself */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   241
	ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   242
	if (!IsValidPlayer(ci->client_playas)) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   243
		/* The uint8 == 1 indicates that a client is following */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   244
		NetworkSend_uint8(packet, 1);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   245
		NetworkSend_string(packet, ci->client_name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   246
		NetworkSend_string(packet, ci->unique_id);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   247
		NetworkSend_uint32(packet, ci->join_date);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   248
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   249
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   250
	/* Indicates end of client list */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   251
	NetworkSend_uint8(packet, 0);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   252
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   253
	NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   254
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   255
	free(packet);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   256
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   257
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   258
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_MASTER_RESPONSE_LIST)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   259
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   260
	int i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   261
	struct in_addr ip;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   262
	uint16 port;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   263
	uint8 ver;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   264
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   265
	/* packet begins with the protocol version (uint8)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   266
	 * then an uint16 which indicates how many
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   267
	 * ip:port pairs are in this packet, after that
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   268
	 * an uint32 (ip) and an uint16 (port) for each pair
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   269
	 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   270
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   271
	ver = NetworkRecv_uint8(&_udp_cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   272
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   273
	if (_udp_cs.has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   274
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   275
	if (ver == 1) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   276
		for (i = NetworkRecv_uint16(&_udp_cs, p); i != 0 ; i--) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   277
			ip.s_addr = TO_LE32(NetworkRecv_uint32(&_udp_cs, p));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   278
			port = NetworkRecv_uint16(&_udp_cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   279
			NetworkUDPQueryServer(inet_ntoa(ip), port);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   280
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   281
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   282
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   283
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   284
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   285
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   286
	_network_advertise_retries = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   287
	DEBUG(net, 2, "[udp] advertising on master server successfull");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   288
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   289
	/* We are advertised, but we don't want to! */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   290
	if (!_network_advertise) NetworkUDPRemoveAdvertise();
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   291
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   292
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   293
/**
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   294
 * A client has requested the names of some NewGRFs.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   295
 *
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   296
 * Replying this can be tricky as we have a limit of SEND_MTU bytes
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   297
 * in the reply packet and we can send up to 100 bytes per NewGRF
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   298
 * (GRF ID, MD5sum and NETWORK_GRF_NAME_LENGTH bytes for the name).
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   299
 * As SEND_MTU is _much_ less than 100 * NETWORK_MAX_GRF_COUNT, it
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   300
 * could be that a packet overflows. To stop this we only reply
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   301
 * with the first N NewGRFs so that if the first N + 1 NewGRFs
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   302
 * would be sent, the packet overflows.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   303
 * in_reply and in_reply_count are used to keep a list of GRFs to
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   304
 * send in the reply.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   305
 */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   306
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_CLIENT_GET_NEWGRFS)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   307
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   308
	uint8 num_grfs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   309
	uint i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   310
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   311
	const GRFConfig *in_reply[NETWORK_MAX_GRF_COUNT];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   312
	Packet *packet;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   313
	uint8 in_reply_count = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   314
	uint packet_len = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   315
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   316
	/* Just a fail-safe.. should never happen */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   317
	if (_udp_cs.has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   318
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   319
	DEBUG(net, 6, "[udp] newgrf data request from %s:%d", inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   320
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   321
	num_grfs = NetworkRecv_uint8 (&_udp_cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   322
	if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   323
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   324
	for (i = 0; i < num_grfs; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   325
		GRFConfig c;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   326
		const GRFConfig *f;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   327
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   328
		NetworkRecv_GRFIdentifier(&_udp_cs, p, &c);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   329
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   330
		/* Find the matching GRF file */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   331
		f = FindGRFConfig(c.grfid, c.md5sum);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   332
		if (f == NULL) continue; // The GRF is unknown to this server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   333
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   334
		/* If the reply might exceed the size of the packet, only reply
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   335
		 * the current list and do not send the other data.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   336
		 * The name could be an empty string, if so take the filename. */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   337
		packet_len += sizeof(c.grfid) + sizeof(c.md5sum) +
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   338
				min(strlen((f->name != NULL && strlen(f->name) > 0) ? f->name : f->filename) + 1, NETWORK_GRF_NAME_LENGTH);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   339
		if (packet_len > SEND_MTU - 4) { // 4 is 3 byte header + grf count in reply
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   340
			break;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   341
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   342
		in_reply[in_reply_count] = f;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   343
		in_reply_count++;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   344
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   345
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   346
	if (in_reply_count == 0) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   347
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   348
	packet = NetworkSend_Init(PACKET_UDP_SERVER_NEWGRFS);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   349
	NetworkSend_uint8 (packet, in_reply_count);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   350
	for (i = 0; i < in_reply_count; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   351
		char name[NETWORK_GRF_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   352
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   353
		/* The name could be an empty string, if so take the filename */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   354
		ttd_strlcpy(name, (in_reply[i]->name != NULL && strlen(in_reply[i]->name) > 0) ?
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   355
				in_reply[i]->name : in_reply[i]->filename, sizeof(name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   356
	 	NetworkSend_GRFIdentifier(packet, in_reply[i]);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   357
		NetworkSend_string(packet, name);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   358
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   359
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   360
	NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   361
	free(packet);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   362
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   363
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   364
/** The return of the client's request of the names of some NewGRFs */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   365
DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_NEWGRFS)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   366
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   367
	uint8 num_grfs;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   368
	uint i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   369
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   370
	/* Just a fail-safe.. should never happen */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   371
	if (_udp_cs.has_quit) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   372
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   373
	DEBUG(net, 6, "[udp] newgrf data reply from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   374
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   375
	num_grfs = NetworkRecv_uint8 (&_udp_cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   376
	if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   377
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   378
	for (i = 0; i < num_grfs; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   379
		char *unknown_name;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   380
		char name[NETWORK_GRF_NAME_LENGTH];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   381
		GRFConfig c;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   382
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   383
		NetworkRecv_GRFIdentifier(&_udp_cs, p, &c);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   384
		NetworkRecv_string(&_udp_cs, p, name, sizeof(name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   385
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   386
		/* An empty name is not possible under normal circumstances
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   387
		 * and causes problems when showing the NewGRF list. */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   388
		if (strlen(name) == 0) continue;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   389
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   390
		/* Finds the fake GRFConfig for the just read GRF ID and MD5sum tuple.
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   391
		 * If it exists and not resolved yet, then name of the fake GRF is
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   392
		 * overwritten with the name from the reply. */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   393
		unknown_name = FindUnknownGRFName(c.grfid, c.md5sum, false);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   394
		if (unknown_name != NULL && strcmp(unknown_name, UNKNOWN_GRF_NAME_PLACEHOLDER) == 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   395
			ttd_strlcpy(unknown_name, name, NETWORK_GRF_NAME_LENGTH);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   396
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   397
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   398
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   399
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   400
/**
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   401
 * Every type of UDP packet should only be received by a single socket;
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   402
 * The socket communicating with the masterserver should receive the
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   403
 * game information of some 'random' host.
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   404
 */
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   405
typedef struct NetworkUDPPacketAndSocket {
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   406
	void (*callback)(Packet *p, const struct sockaddr_in *client_addr);
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   407
	SOCKET *incoming_socket;
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   408
} NetworkUPDPacketAndSocket;
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   409
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   410
static const NetworkUPDPacketAndSocket _network_udp_packet[PACKET_UDP_END] = {
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   411
	{ RECEIVE_COMMAND(PACKET_UDP_CLIENT_FIND_SERVER),   &_udp_server_socket },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   412
	{ RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE),      &_udp_client_socket },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   413
	{ RECEIVE_COMMAND(PACKET_UDP_CLIENT_DETAIL_INFO),   &_udp_server_socket },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   414
	{ NULL,                                             NULL                },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   415
	{ NULL,                                             NULL                },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   416
	{ RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER),  &_udp_master_socket },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   417
	{ NULL,                                             NULL                },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   418
	{ RECEIVE_COMMAND(PACKET_UDP_MASTER_RESPONSE_LIST), &_udp_client_socket },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   419
	{ NULL,                                             NULL                },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   420
	{ RECEIVE_COMMAND(PACKET_UDP_CLIENT_GET_NEWGRFS),   &_udp_server_socket },
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   421
	{ RECEIVE_COMMAND(PACKET_UDP_SERVER_NEWGRFS),       &_udp_client_socket },
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   422
};
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   423
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   424
void NetworkHandleUDPPacket(const SOCKET udp, Packet *p, const struct sockaddr_in *client_addr)
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   425
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   426
	byte type;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   427
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   428
	/* Fake a client, so we can see when there is an illegal packet */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   429
	_udp_cs.socket = INVALID_SOCKET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   430
	_udp_cs.has_quit = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   431
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   432
	type = NetworkRecv_uint8(&_udp_cs, p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   433
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   434
	if (type < PACKET_UDP_END && *_network_udp_packet[type].incoming_socket == udp && !_udp_cs.has_quit) {
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   435
		_network_udp_packet[type].callback(p, client_addr);
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   436
	} else {
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   437
		if (*_network_udp_packet[type].incoming_socket != udp) {
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   438
			DEBUG(net, 0, "[udp] received packet on wrong port from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   439
		} else if (!_udp_cs.has_quit) {
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   440
			DEBUG(net, 0, "[udp] received invalid packet type %d from %s:%d", type,  inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   441
		} else {
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   442
			DEBUG(net, 0, "[udp] received illegal packet from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   443
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   444
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   445
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   446
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   447
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   448
// Close UDP connection
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   449
void NetworkUDPStop(void)
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   450
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   451
	DEBUG(net, 1, "[udp] closed listeners");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   452
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   453
	if (_network_udp_server) {
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   454
		NetworkUDPClose(&_udp_server_socket);
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   455
		NetworkUDPClose(&_udp_master_socket);
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   456
	} else {
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   457
		NetworkUDPClose(&_udp_client_socket);
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   458
	}
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   459
5648
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   460
	_network_udp_server = false;
1608018c5ff2 (svn r8059) [cbh] - Sync with r7788:8032 from trunk
celestar
parents: 5643
diff changeset
   461
	_network_udp_broadcast = 0;
5642
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   462
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   463
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   464
// Broadcast to all ips
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   465
static void NetworkUDPBroadCast(SOCKET udp)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   466
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   467
	Packet* p = NetworkSend_Init(PACKET_UDP_CLIENT_FIND_SERVER);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   468
	uint i;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   469
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   470
	for (i = 0; _broadcast_list[i] != 0; i++) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   471
		struct sockaddr_in out_addr;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   472
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   473
		out_addr.sin_family = AF_INET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   474
		out_addr.sin_port = htons(_network_server_port);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   475
		out_addr.sin_addr.s_addr = _broadcast_list[i];
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   476
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   477
		DEBUG(net, 4, "[udp] broadcasting to %s", inet_ntoa(out_addr.sin_addr));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   478
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   479
		NetworkSendUDP_Packet(udp, p, &out_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   480
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   481
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   482
	free(p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   483
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   484
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   485
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   486
// Request the the server-list from the master server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   487
void NetworkUDPQueryMasterServer(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   488
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   489
	struct sockaddr_in out_addr;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   490
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   491
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   492
	if (_udp_client_socket == INVALID_SOCKET)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   493
		if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   494
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   495
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   496
	p = NetworkSend_Init(PACKET_UDP_CLIENT_GET_LIST);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   497
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   498
	out_addr.sin_family = AF_INET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   499
	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   500
	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   501
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   502
	// packet only contains protocol version
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   503
	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   504
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   505
	NetworkSendUDP_Packet(_udp_client_socket, p, &out_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   506
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   507
	DEBUG(net, 2, "[udp] master server queried at %s:%d", inet_ntoa(out_addr.sin_addr),ntohs(out_addr.sin_port));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   508
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   509
	free(p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   510
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   511
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   512
// Find all servers
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   513
void NetworkUDPSearchGame(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   514
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   515
	// We are still searching..
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   516
	if (_network_udp_broadcast > 0) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   517
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   518
	// No UDP-socket yet..
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   519
	if (_udp_client_socket == INVALID_SOCKET)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   520
		if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   521
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   522
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   523
	DEBUG(net, 0, "[udp] searching server");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   524
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   525
	NetworkUDPBroadCast(_udp_client_socket);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   526
	_network_udp_broadcast = 300; // Stay searching for 300 ticks
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   527
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   528
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   529
NetworkGameList *NetworkUDPQueryServer(const char* host, unsigned short port)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   530
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   531
	struct sockaddr_in out_addr;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   532
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   533
	NetworkGameList *item;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   534
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   535
	// No UDP-socket yet..
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   536
	if (_udp_client_socket == INVALID_SOCKET)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   537
		if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   538
			return NULL;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   539
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   540
	out_addr.sin_family = AF_INET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   541
	out_addr.sin_port = htons(port);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   542
	out_addr.sin_addr.s_addr = NetworkResolveHost(host);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   543
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   544
	// Clear item in gamelist
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   545
	item = NetworkGameListAddItem(inet_addr(inet_ntoa(out_addr.sin_addr)), ntohs(out_addr.sin_port));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   546
	memset(&item->info, 0, sizeof(item->info));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   547
	ttd_strlcpy(item->info.server_name, host, lengthof(item->info.server_name));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   548
	ttd_strlcpy(item->info.hostname, host, lengthof(item->info.hostname));
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   549
	item->online = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   550
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   551
	// Init the packet
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   552
	p = NetworkSend_Init(PACKET_UDP_CLIENT_FIND_SERVER);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   553
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   554
	NetworkSendUDP_Packet(_udp_client_socket, p, &out_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   555
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   556
	free(p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   557
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   558
	UpdateNetworkGameWindow(false);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   559
	return item;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   560
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   561
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   562
/* Remove our advertise from the master-server */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   563
void NetworkUDPRemoveAdvertise(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   564
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   565
	struct sockaddr_in out_addr;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   566
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   567
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   568
	/* Check if we are advertising */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   569
	if (!_networking || !_network_server || !_network_udp_server) return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   570
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   571
	/* check for socket */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   572
	if (_udp_master_socket == INVALID_SOCKET)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   573
		if (!NetworkUDPListen(&_udp_master_socket, _network_server_bind_ip, 0, false))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   574
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   575
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   576
	DEBUG(net, 1, "[udp] removing advertise from master server");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   577
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   578
	/* Find somewhere to send */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   579
	out_addr.sin_family = AF_INET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   580
	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   581
	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   582
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   583
	/* Send the packet */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   584
	p = NetworkSend_Init(PACKET_UDP_SERVER_UNREGISTER);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   585
	/* Packet is: Version, server_port */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   586
	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   587
	NetworkSend_uint16(p, _network_server_port);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   588
	NetworkSendUDP_Packet(_udp_master_socket, p, &out_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   589
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   590
	free(p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   591
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   592
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   593
/* Register us to the master server
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   594
     This function checks if it needs to send an advertise */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   595
void NetworkUDPAdvertise(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   596
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   597
	struct sockaddr_in out_addr;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   598
	Packet *p;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   599
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   600
	/* Check if we should send an advertise */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   601
	if (!_networking || !_network_server || !_network_udp_server || !_network_advertise)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   602
		return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   603
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   604
	/* check for socket */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   605
	if (_udp_master_socket == INVALID_SOCKET)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   606
		if (!NetworkUDPListen(&_udp_master_socket, _network_server_bind_ip, 0, false))
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   607
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   608
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   609
	if (_network_need_advertise) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   610
		_network_need_advertise = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   611
		_network_advertise_retries = ADVERTISE_RETRY_TIMES;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   612
	} else {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   613
		/* Only send once every ADVERTISE_NORMAL_INTERVAL ticks */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   614
		if (_network_advertise_retries == 0) {
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   615
			if ((_network_last_advertise_frame + ADVERTISE_NORMAL_INTERVAL) > _frame_counter)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   616
				return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   617
			_network_advertise_retries = ADVERTISE_RETRY_TIMES;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   618
		}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   619
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   620
		if ((_network_last_advertise_frame + ADVERTISE_RETRY_INTERVAL) > _frame_counter)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   621
			return;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   622
	}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   623
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   624
	_network_advertise_retries--;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   625
	_network_last_advertise_frame = _frame_counter;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   626
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   627
	/* Find somewhere to send */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   628
	out_addr.sin_family = AF_INET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   629
	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   630
	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   631
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   632
	DEBUG(net, 1, "[udp] advertising to master server");
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   633
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   634
	/* Send the packet */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   635
	p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   636
	/* Packet is: WELCOME_MESSAGE, Version, server_port */
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   637
	NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   638
	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   639
	NetworkSend_uint16(p, _network_server_port);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   640
	NetworkSendUDP_Packet(_udp_master_socket, p, &out_addr);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   641
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   642
	free(p);
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   643
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   644
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   645
void NetworkUDPInitialize(void)
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   646
{
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   647
	_udp_client_socket = INVALID_SOCKET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   648
	_udp_server_socket = INVALID_SOCKET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   649
	_udp_master_socket = INVALID_SOCKET;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   650
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   651
	_network_udp_server = false;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   652
	_network_udp_broadcast = 0;
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   653
}
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   654
bfa6074e2833 (svn r7789) [cbh] - Sync with r7720:7758 from trunk
celestar
parents:
diff changeset
   655
#endif /* ENABLE_NETWORK */