about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-21 21:28:56 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-21 21:28:56 +0000
commit9ef96af0545ed33e326bb863fb740705dd0b17c5 (patch)
tree7d98f1f67d1d7ed4514dfa73de016339dd42c028 /src
parent4229cee5040516a5968a22549a40050c4739e1ba (diff)
downloadzcatch-9ef96af0545ed33e326bb863fb740705dd0b17c5.tar.gz
zcatch-9ef96af0545ed33e326bb863fb740705dd0b17c5.zip
fixed alot of masterserver fixes
Diffstat (limited to 'src')
-rw-r--r--src/engine/client/client.cpp5
-rw-r--r--src/engine/config_variables.h2
-rw-r--r--src/engine/server/server.cpp35
-rw-r--r--src/mastersrv/mastersrv.cpp125
-rw-r--r--src/mastersrv/mastersrv.h8
5 files changed, 162 insertions, 13 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index 56a7f5d9..8d7fb1e2 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -417,7 +417,7 @@ public:
 		net.open(0, 0);
 		
 		//
-		net_host_lookup(MASTERSERVER_ADDRESS, MASTERSERVER_PORT, &master_server);
+		net_host_lookup(config.masterserver, MASTERSERVER_PORT, &master_server);
 
 		// connect to the server if wanted
 		if(direct_connect_server)
@@ -576,6 +576,9 @@ public:
 					sprintf(servers.infos[i].address, "%d.%d.%d.%d:%d",
 						servers.addresses[i].ip[0], servers.addresses[i].ip[1], servers.addresses[i].ip[2],
 						servers.addresses[i].ip[3], servers.addresses[i].port);
+					sprintf(servers.infos[i].name, "%d.%d.%d.%d:%d",
+						servers.addresses[i].ip[0], servers.addresses[i].ip[1], servers.addresses[i].ip[2],
+						servers.addresses[i].ip[3], servers.addresses[i].port);
 				}
 			}
 
diff --git a/src/engine/config_variables.h b/src/engine/config_variables.h
index 788c0e7d..a5c4ef5d 100644
--- a/src/engine/config_variables.h
+++ b/src/engine/config_variables.h
@@ -9,4 +9,6 @@ MACRO_CONFIG_STR(player_name, 32, "nameless tee")
 MACRO_CONFIG_STR(clan_name, 32, "")
 MACRO_CONFIG_STR(password, 32, "")
 
+MACRO_CONFIG_STR(masterserver, 128, "master.teewars.com")
+
 MACRO_CONFIG_INT(sv_port, 8303, 0, 0)
diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp
index fd4f16fa..32be58ac 100644
--- a/src/engine/server/server.cpp
+++ b/src/engine/server/server.cpp
@@ -165,14 +165,12 @@ public:
 		//for(int i = 0; i < MAX_CLIENTS; i++)
 			//dbg_msg("network/server", "\t%d: %d", i, clients[i].state);
 
-		if (net_host_lookup(MASTERSERVER_ADDRESS, MASTERSERVER_PORT, &master_server) != 0)
+		dbg_msg("server", "masterserver is %s", config.masterserver);
+		if (net_host_lookup(config.masterserver, MASTERSERVER_PORT, &master_server) != 0)
 		{
 			// TODO: fix me
 			//master_server = netaddr4(0, 0, 0, 0, 0);
 		}
-		
-		dbg_msg("server", "masterserver = %d.%d.%d.%d:%d",
-			master_server.ip[0], master_server.ip[1], master_server.ip[2], master_server.ip[3], master_server.port);
 
 		mods_init();
 
@@ -463,6 +461,19 @@ public:
 		net.send(&packet);
 	}
 
+
+	void send_fwcheckresponse(NETADDR4 *addr)
+	{
+		dbg_msg("server", "sending heartbeat");
+		NETPACKET packet;
+		packet.client_id = -1;
+		packet.address = *addr;
+		packet.flags = PACKETFLAG_CONNLESS;
+		packet.data_size = sizeof(SERVERBROWSE_FWRESPONSE);
+		packet.data = SERVERBROWSE_FWRESPONSE;
+		net.send(&packet);
+	}
+
 	void pump_network()
 	{
 		net.update();
@@ -479,7 +490,21 @@ public:
 				{
 					dbg_msg("server", "info requested");
 					send_serverinfo(&packet.address);
-					
+				}
+				else if(packet.data_size == sizeof(SERVERBROWSE_FWCHECK) &&
+					memcmp(packet.data, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0)
+				{
+					send_fwcheckresponse(&packet.address);
+				}
+				else if(packet.data_size == sizeof(SERVERBROWSE_FWOK) &&
+					memcmp(packet.data, SERVERBROWSE_FWOK, sizeof(SERVERBROWSE_FWOK)) == 0)
+				{
+					dbg_msg("server", "no firewall/nat problems detected");
+				}
+				else if(packet.data_size == sizeof(SERVERBROWSE_FWERROR) &&
+					memcmp(packet.data, SERVERBROWSE_FWERROR, sizeof(SERVERBROWSE_FWERROR)) == 0)
+				{
+					dbg_msg("server", "ERROR: clients can not connect due to FIREWALL/NAT");
 				}
 			}
 			else
diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp
index 03c06b97..78f43a87 100644
--- a/src/mastersrv/mastersrv.cpp
+++ b/src/mastersrv/mastersrv.cpp
@@ -9,6 +9,14 @@ enum {
 	EXPIRE_TIME = 90
 };
 
+static struct check_server
+{
+	NETADDR4 address;
+	int try_count;
+	int64 try_time;
+} check_servers[MAX_SERVERS];
+static int num_checkservers = 0;
+
 static struct packet_data
 {
 	unsigned char header[sizeof(SERVERBROWSE_LIST)];
@@ -17,7 +25,58 @@ static struct packet_data
 static int64 server_expire[MAX_SERVERS];
 static int num_servers = 0;
 
-static net_client net;
+static net_client net_checker; // NAT/FW checker
+static net_client net_op; // main
+
+void send_ok(NETADDR4 *addr)
+{
+	NETPACKET p;
+	p.client_id = -1;
+	p.address = *addr;
+	p.flags = PACKETFLAG_CONNLESS;
+	p.data_size = sizeof(SERVERBROWSE_FWOK);
+	p.data = SERVERBROWSE_FWOK;
+	net_op.send(&p);
+}
+
+void send_error(NETADDR4 *addr)
+{
+	NETPACKET p;
+	p.client_id = -1;
+	p.address = *addr;
+	p.flags = PACKETFLAG_CONNLESS;
+	p.data_size = sizeof(SERVERBROWSE_FWERROR);
+	p.data = SERVERBROWSE_FWERROR;
+	net_op.send(&p);
+}
+
+void send_check(NETADDR4 *addr)
+{
+	NETPACKET p;
+	p.client_id = -1;
+	p.address = *addr;
+	p.flags = PACKETFLAG_CONNLESS;
+	p.data_size = sizeof(SERVERBROWSE_FWCHECK);
+	p.data = SERVERBROWSE_FWCHECK;
+	net_checker.send(&p);
+}
+
+void add_checkserver(NETADDR4 *info)
+{
+	// add server
+	if(num_checkservers == MAX_SERVERS)
+	{
+		dbg_msg("mastersrv", "error: mastersrv is full");
+		return;
+	}
+	
+	dbg_msg("mastersrv", "checking: %d.%d.%d.%d:%d",
+		info->ip[0], info->ip[1], info->ip[2], info->ip[3], info->port);
+	check_servers[num_checkservers].address = *info;
+	check_servers[num_checkservers].try_count = 0;
+	check_servers[num_checkservers].try_time = 0;
+	num_checkservers++;
+}
 
 void add_server(NETADDR4 *info)
 {
@@ -48,6 +107,36 @@ void add_server(NETADDR4 *info)
 	num_servers++;
 }
 
+void update_servers()
+{
+	int64 now = time_get();
+	int64 freq = time_freq();
+	for(int i = 0; i < num_checkservers; i++)
+	{
+		if(now > check_servers[i].try_time+freq)
+		{
+			if(check_servers[i].try_count == 5)
+			{
+				dbg_msg("mastersrv", "check failed: %d.%d.%d.%d:%d",
+					check_servers[i].address.ip[0], check_servers[i].address.ip[1],
+					check_servers[i].address.ip[2], check_servers[i].address.ip[3],check_servers[i].address.port);
+					
+				// FAIL!!
+				send_error(&check_servers[i].address);
+				check_servers[i] = check_servers[num_checkservers-1];
+				num_checkservers--;
+				i--;
+			}
+			else
+			{
+				check_servers[i].try_count++;
+				check_servers[i].try_time = now;
+				send_check(&check_servers[i].address);
+			}
+		}
+	}
+}
+
 void purge_servers()
 {
 	int64 now = time_get();
@@ -71,7 +160,8 @@ void purge_servers()
 
 int main(int argc, char **argv)
 {
-	net.open(MASTERSERVER_PORT, 0);
+	net_op.open(MASTERSERVER_PORT, 0);
+	net_checker.open(MASTERSERVER_PORT+1, 0);
 	// TODO: check socket for errors
 	
 	mem_copy(data.header, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
@@ -79,17 +169,18 @@ int main(int argc, char **argv)
 	
 	while(1)
 	{
-		net.update();
+		net_op.update();
+		net_checker.update();
 		
 		// process packets
 		NETPACKET packet;
-		while(net.recv(&packet))
+		while(net_op.recv(&packet))
 		{
 			if(packet.data_size == sizeof(SERVERBROWSE_HEARTBEAT) &&
 				memcmp(packet.data, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0)
 			{
 				// add it
-				add_server(&packet.address);
+				add_checkserver(&packet.address);
 			}
 			else if(packet.data_size == sizeof(SERVERBROWSE_GETLIST) &&
 				memcmp(packet.data, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0)
@@ -102,13 +193,35 @@ int main(int argc, char **argv)
 				p.flags = PACKETFLAG_CONNLESS;
 				p.data_size = num_servers*sizeof(NETADDR4)+sizeof(SERVERBROWSE_LIST);
 				p.data = &data;
-				net.send(&p);
+				net_op.send(&p);
 			}
+		}
 
+		// process packets
+		while(net_checker.recv(&packet))
+		{
+			if(packet.data_size == sizeof(SERVERBROWSE_FWRESPONSE) &&
+				memcmp(packet.data, SERVERBROWSE_FWRESPONSE, sizeof(SERVERBROWSE_FWRESPONSE)) == 0)
+			{
+				// remove it from checking
+				for(int i = 0; i < num_checkservers; i++)
+				{
+					if(net_addr4_cmp(&check_servers[i].address, &packet.address) == 0)
+					{
+						num_checkservers--;
+						check_servers[i] = check_servers[num_checkservers];
+						break;
+					}
+				}
+				
+				add_server(&packet.address);
+				send_ok(&packet.address);
+			}
 		}
 		
 		// TODO: shouldn't be done every fuckin frame
 		purge_servers();
+		update_servers();
 		
 		// be nice to the CPU
 		thread_sleep(1);
diff --git a/src/mastersrv/mastersrv.h b/src/mastersrv/mastersrv.h
index fd59808f..cd98bec2 100644
--- a/src/mastersrv/mastersrv.h
+++ b/src/mastersrv/mastersrv.h
@@ -1,4 +1,3 @@
-static const char *MASTERSERVER_ADDRESS = "localhost";
 static const int MASTERSERVER_PORT = 8383;
 
 static const int MAX_SERVERS = 200;
@@ -13,7 +12,14 @@ static const int MAX_SERVERS = 200;
 };*/
 
 static const unsigned char SERVERBROWSE_HEARTBEAT[] = {255, 255, 255, 255, 'b', 'e', 'a', 't'};
+
 static const unsigned char SERVERBROWSE_GETLIST[] = {255, 255, 255, 255, 'r', 'e', 'q', 't'};
 static const unsigned char SERVERBROWSE_LIST[] = {255, 255, 255, 255, 'l', 'i', 's', 't'};
+
 static const unsigned char SERVERBROWSE_GETINFO[] = {255, 255, 255, 255, 'g', 'i', 'e', 'f'};
 static const unsigned char SERVERBROWSE_INFO[] = {255, 255, 255, 255, 'i', 'n', 'f', 'o'};
+
+static const unsigned char SERVERBROWSE_FWCHECK[] = {255, 255, 255, 255, 'f', 'w', '?', '?'};
+static const unsigned char SERVERBROWSE_FWRESPONSE[] = {255, 255, 255, 255, 'f', 'w', '!', '!'};
+static const unsigned char SERVERBROWSE_FWOK[] = {255, 255, 255, 255, 'f', 'w', 'o', 'k'};
+static const unsigned char SERVERBROWSE_FWERROR[] = {255, 255, 255, 255, 'f', 'w', 'e', 'r'};