diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-21 18:07:27 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-21 18:07:27 +0000 |
| commit | 9e4aea97bdb5a903150df57f8d546733ce4b4db2 (patch) | |
| tree | 7e18776bd7ace981895bca01ac753c9c289a71a5 /src/mastersrv | |
| parent | f0e8502050ce27b9cef72fa385619d13faa35c27 (diff) | |
| download | zcatch-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.cpp | 118 | ||||
| -rw-r--r-- | src/mastersrv/mastersrv.h | 19 |
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'}; |