about summary refs log tree commit diff
path: root/src/mastersrv
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-21 18:07:27 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-21 18:07:27 +0000
commit9e4aea97bdb5a903150df57f8d546733ce4b4db2 (patch)
tree7e18776bd7ace981895bca01ac753c9c289a71a5 /src/mastersrv
parentf0e8502050ce27b9cef72fa385619d13faa35c27 (diff)
downloadzcatch-9e4aea97bdb5a903150df57f8d546733ce4b4db2.tar.gz
zcatch-9e4aea97bdb5a903150df57f8d546733ce4b4db2.zip
lots of cool new features :D new master server
Diffstat (limited to 'src/mastersrv')
-rw-r--r--src/mastersrv/mastersrv.cpp118
-rw-r--r--src/mastersrv/mastersrv.h19
2 files changed, 137 insertions, 0 deletions
diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp
new file mode 100644
index 00000000..03c06b97
--- /dev/null
+++ b/src/mastersrv/mastersrv.cpp
@@ -0,0 +1,118 @@
+#include <string.h>
+#include <baselib/system.h>
+#include <engine/network.h>
+
+#include "mastersrv.h"
+
+enum {
+	MTU = 1400,
+	EXPIRE_TIME = 90
+};
+
+static struct packet_data
+{
+	unsigned char header[sizeof(SERVERBROWSE_LIST)];
+	NETADDR4 servers[MAX_SERVERS];
+} data;
+static int64 server_expire[MAX_SERVERS];
+static int num_servers = 0;
+
+static net_client net;
+
+void add_server(NETADDR4 *info)
+{
+	// see if server already exists in list
+	int i;
+	for(i = 0; i < num_servers; i++)
+	{
+		if(net_addr4_cmp(&data.servers[i], info) == 0)
+		{
+			dbg_msg("mastersrv", "updated: %d.%d.%d.%d:%d",
+				info->ip[0], info->ip[1], info->ip[2], info->ip[3], info->port);
+			server_expire[i] = time_get()+time_freq()*EXPIRE_TIME;
+			return;
+		}
+	}
+	
+	// add server
+	if(num_servers == MAX_SERVERS)
+	{
+		dbg_msg("mastersrv", "error: mastersrv is full");
+		return;
+	}
+	
+	dbg_msg("mastersrv", "added: %d.%d.%d.%d:%d",
+		info->ip[0], info->ip[1], info->ip[2], info->ip[3], info->port);
+	data.servers[num_servers] = *info;
+	server_expire[num_servers] = time_get()+time_freq()*EXPIRE_TIME;
+	num_servers++;
+}
+
+void purge_servers()
+{
+	int64 now = time_get();
+	int i = 0;
+	while(i < num_servers)
+	{
+		if(server_expire[i] < now)
+		{
+			// remove server
+			dbg_msg("mastersrv", "expired: %d.%d.%d.%d:%d",
+				data.servers[i].ip[0], data.servers[i].ip[1],
+				data.servers[i].ip[2], data.servers[i].ip[3], data.servers[i].port);
+			data.servers[i] = data.servers[num_servers-1];
+			server_expire[i] = server_expire[num_servers-1];
+			num_servers--;
+		}
+		else
+			i++;
+	}
+}
+
+int main(int argc, char **argv)
+{
+	net.open(MASTERSERVER_PORT, 0);
+	// TODO: check socket for errors
+	
+	mem_copy(data.header, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
+	dbg_msg("mastersrv", "started");
+	
+	while(1)
+	{
+		net.update();
+		
+		// process packets
+		NETPACKET packet;
+		while(net.recv(&packet))
+		{
+			if(packet.data_size == sizeof(SERVERBROWSE_HEARTBEAT) &&
+				memcmp(packet.data, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0)
+			{
+				// add it
+				add_server(&packet.address);
+			}
+			else if(packet.data_size == sizeof(SERVERBROWSE_GETLIST) &&
+				memcmp(packet.data, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0)
+			{
+				// someone requested the list
+				dbg_msg("mastersrv", "requested, responding with %d servers", num_servers);
+				NETPACKET p;
+				p.client_id = -1;
+				p.address = packet.address;
+				p.flags = PACKETFLAG_CONNLESS;
+				p.data_size = num_servers*sizeof(NETADDR4)+sizeof(SERVERBROWSE_LIST);
+				p.data = &data;
+				net.send(&p);
+			}
+
+		}
+		
+		// TODO: shouldn't be done every fuckin frame
+		purge_servers();
+		
+		// be nice to the CPU
+		thread_sleep(1);
+	}
+	
+	return 0;
+}
diff --git a/src/mastersrv/mastersrv.h b/src/mastersrv/mastersrv.h
new file mode 100644
index 00000000..fd59808f
--- /dev/null
+++ b/src/mastersrv/mastersrv.h
@@ -0,0 +1,19 @@
+static const char *MASTERSERVER_ADDRESS = "localhost";
+static const int MASTERSERVER_PORT = 8383;
+
+static const int MAX_SERVERS = 200;
+
+/*enum {
+	SERVERBROWSE_NULL=0,
+	SERVERBROWSE_HEARTBEAT,
+	SERVERBROWSE_GETLIST,
+	SERVERBROWSE_LIST,
+	SERVERBROWSE_GETINFO,
+	SERVERBROWSE_INFO,
+};*/
+
+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'};