about summary refs log tree commit diff
path: root/masterserver/include
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-05-22 15:03:32 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-05-22 15:03:32 +0000
commit73aa9b71c1d8b5c5065d1e474f13601da3ca6b20 (patch)
tree88b6a0a4a2ebdd33a88f4a25682581d329d33f6b /masterserver/include
downloadzcatch-73aa9b71c1d8b5c5065d1e474f13601da3ca6b20.tar.gz
zcatch-73aa9b71c1d8b5c5065d1e474f13601da3ca6b20.zip
started the major restructure of svn
Diffstat (limited to 'masterserver/include')
-rw-r--r--masterserver/include/common.h6
-rw-r--r--masterserver/include/masterserver.h48
-rw-r--r--masterserver/include/network.h13
-rw-r--r--masterserver/include/serverinfo.h69
4 files changed, 136 insertions, 0 deletions
diff --git a/masterserver/include/common.h b/masterserver/include/common.h
new file mode 100644
index 00000000..ff03a61b
--- /dev/null
+++ b/masterserver/include/common.h
@@ -0,0 +1,6 @@
+#ifndef _COMMON_H
+#define _COMMON_H
+
+typedef int int32;
+
+#endif
diff --git a/masterserver/include/masterserver.h b/masterserver/include/masterserver.h
new file mode 100644
index 00000000..7e042aaa
--- /dev/null
+++ b/masterserver/include/masterserver.h
@@ -0,0 +1,48 @@
+#ifndef _MASTERSERVER_H
+#define _MASTERSERVER_H
+
+#include <baselib/network.h>
+#include "serverinfo.h"
+
+using namespace baselib;
+
+#define HEARTBEAT_SIZE 216
+#define HEARTBEAT_SIGNATURE 'TWHB'
+#define HEARTBEAT_LIFETIME 10
+#define MAXSERVERS 1024
+#define SERVERINFOOUT_SIZE 212
+#define SERVERINFOHEADER_SIZE 12
+#define MASTERSERVER_VERSION 0
+
+class CMasterServer
+{
+	CServerInfo m_Servers[MAXSERVERS];
+	int m_ServerCount;
+	socket_udp4 m_UDPSocket;
+	socket_tcp4 m_TCPSocket;
+	int m_CurrentTime;
+	char m_ServerListPacket[MAXSERVERS * SERVERINFOOUT_SIZE + SERVERINFOHEADER_SIZE];
+	int m_ServerListPacketSize;
+	bool m_ServerListPacketIsOld;
+
+	void ListenForServerListPolls();
+	void BuildServerListPacket();
+    void ListenForHeartBeats();
+    void ProcessHeartBeat(CServerInfo info);
+    CServerInfo *FindServerInfo(int32 ip, int32 port);
+    CServerInfo *GetUnusedSlot();
+    void CleanUpServerList();
+public:
+	CMasterServer()
+	{
+		m_ServerCount = 0;
+		m_ServerListPacketIsOld = true;
+	}
+
+	void Init(int port);
+	void Shutdown(); 
+		
+	void Tick();
+};
+
+#endif
diff --git a/masterserver/include/network.h b/masterserver/include/network.h
new file mode 100644
index 00000000..455fe681
--- /dev/null
+++ b/masterserver/include/network.h
@@ -0,0 +1,13 @@
+#ifndef _NETWORK_H
+#define _NETWORK_H
+
+#include <cstring>
+#include "common.h"
+
+char *WriteInt32(char *buffer, int32 value);
+char *WriteFixedString(char *buffer, const char *string, int strlen);
+
+char *ReadInt32(char *buffer, int32 *value);
+char *ReadFixedString(char *buffer, char *string, int strlen);
+
+#endif
diff --git a/masterserver/include/serverinfo.h b/masterserver/include/serverinfo.h
new file mode 100644
index 00000000..c63e11ba
--- /dev/null
+++ b/masterserver/include/serverinfo.h
@@ -0,0 +1,69 @@
+#ifndef _SERVERINFO_H
+#define _SERVERINFO_H
+
+#include <baselib/network.h>
+
+#include "common.h"
+#include "network.h"
+
+class CServerInfo
+{
+	int32 m_Version;
+	int32 m_IP;
+	int32 m_Port;
+	int32 m_Players;
+	int32 m_MaxPlayers;
+	char m_Name[128];
+	char m_Map[64];
+
+	int m_LastRefresh;
+
+public:
+	int32 IP() const { return m_IP; }
+	int32 Port() const { return m_Port; }
+	int32 Players() const { return m_Players; }
+	int32 MaxPlayers() const { return m_MaxPlayers; };
+	const char *Name() const { return m_Name; }
+	const char *Map() const { return m_Map; }
+
+	void Refresh(int time) { m_LastRefresh = time; }
+	int LastRefresh() { return m_LastRefresh; }
+
+	void SetAddress(baselib::netaddr4 *addr)
+	{
+		m_IP = addr->ip[0] << 24;
+		m_IP |= addr->ip[1] << 16;
+		m_IP |= addr->ip[2] << 8;
+		m_IP |= addr->ip[3];
+
+		m_Port = addr->port;
+	}
+	
+	char *Serialize(char *buffer) const
+	{
+		buffer = WriteInt32(buffer, m_Version);
+		buffer = WriteInt32(buffer, m_IP);
+		buffer = WriteInt32(buffer, m_Port);
+		buffer = WriteInt32(buffer, m_Players);
+		buffer = WriteInt32(buffer, m_MaxPlayers);
+		buffer = WriteFixedString(buffer, m_Name, sizeof(m_Name));
+		buffer = WriteFixedString(buffer, m_Map, sizeof(m_Map));
+
+		return buffer;
+	}
+
+	char *Deserialize(char *buffer)
+	{
+		buffer = ReadInt32(buffer, &m_Version);
+		buffer = ReadInt32(buffer, &m_IP);
+		buffer = ReadInt32(buffer, &m_Port);
+		buffer = ReadInt32(buffer, &m_Players);
+		buffer = ReadInt32(buffer, &m_MaxPlayers);
+		buffer = ReadFixedString(buffer, m_Name, sizeof(m_Name));
+		buffer = ReadFixedString(buffer, m_Map, sizeof(m_Map));
+
+		return buffer;
+	}
+};
+
+#endif