diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine/client/client.cpp | 5 | ||||
| -rw-r--r-- | src/engine/config_variables.h | 2 | ||||
| -rw-r--r-- | src/engine/server/server.cpp | 35 | ||||
| -rw-r--r-- | src/mastersrv/mastersrv.cpp | 125 | ||||
| -rw-r--r-- | src/mastersrv/mastersrv.h | 8 |
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'}; |