diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-05-22 15:03:32 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-05-22 15:03:32 +0000 |
| commit | 73aa9b71c1d8b5c5065d1e474f13601da3ca6b20 (patch) | |
| tree | 88b6a0a4a2ebdd33a88f4a25682581d329d33f6b /masterserver/include | |
| download | zcatch-73aa9b71c1d8b5c5065d1e474f13601da3ca6b20.tar.gz zcatch-73aa9b71c1d8b5c5065d1e474f13601da3ca6b20.zip | |
started the major restructure of svn
Diffstat (limited to 'masterserver/include')
| -rw-r--r-- | masterserver/include/common.h | 6 | ||||
| -rw-r--r-- | masterserver/include/masterserver.h | 48 | ||||
| -rw-r--r-- | masterserver/include/network.h | 13 | ||||
| -rw-r--r-- | masterserver/include/serverinfo.h | 69 |
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 |