diff --git a/bam.lua b/bam.lua index 9226f4c33..54e7dd96f 100644 --- a/bam.lua +++ b/bam.lua @@ -319,6 +319,7 @@ function build(settings) versionserver = Compile(settings, Collect("src/versionsrv/*.cpp")) masterserver = Compile(settings, Collect("src/mastersrv/*.cpp")) + ping = Compile(settings, Collect("src/ping/*.cpp")) game_shared = Compile(settings, Collect("src/game/*.cpp"), nethash, network_source) game_client = Compile(client_settings, CollectRecursive("src/game/client/*.cpp"), client_content_source) game_server = Compile(settings, CollectRecursive("src/game/server/*.cpp"), server_content_source) @@ -359,6 +360,9 @@ function build(settings) masterserver_exe = Link(server_settings, "mastersrv", masterserver, engine, zlib) + ping_exe = Link(server_settings, "ping", ping, + engine, zlib) + -- make targets c = PseudoTarget("client".."_"..settings.config_name, client_exe, client_depends) if string.find(settings.config_name, "sql") then @@ -371,8 +375,9 @@ function build(settings) v = PseudoTarget("versionserver".."_"..settings.config_name, versionserver_exe) m = PseudoTarget("masterserver".."_"..settings.config_name, masterserver_exe) t = PseudoTarget("tools".."_"..settings.config_name, tools) + p = PseudoTarget("ping".."_"..settings.config_name, ping_exe) - all = PseudoTarget(settings.config_name, c, s, v, m, t) + all = PseudoTarget(settings.config_name, c, s, v, m, t, p) return all end diff --git a/src/ping/ping.cpp b/src/ping/ping.cpp new file mode 100644 index 000000000..0315a7ddc --- /dev/null +++ b/src/ping/ping.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include + +static CNetClient g_NetOp; // main + +int main(int argc, char **argv) // ignore_convention +{ + NETADDR BindAddr; + BindAddr.type = NETTYPE_ALL; + g_NetOp.Open(BindAddr, 0); + + if(argc != 2) + { + dbg_msg("ping", "wrong parameters"); + return 1; + } + + NETADDR Addr; + if (net_host_lookup(argv[1], &Addr, NETTYPE_ALL)) + { + dbg_msg("ping", "host lookup failed"); + return 1; + } + + unsigned char Buffer[sizeof(SERVERBROWSE_GETINFO)+1]; + CNetChunk Packet; + + mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); + + int CurToken = rand() % 256; + Buffer[sizeof(SERVERBROWSE_GETINFO)] = CurToken; + + Packet.m_ClientID = -1; + Packet.m_Address = Addr; + Packet.m_Flags = NETSENDFLAG_CONNLESS; + Packet.m_DataSize = sizeof(Buffer); + Packet.m_pData = Buffer; + + g_NetOp.Send(&Packet); + + int64 startTime = time_get(); + + net_socket_read_wait(g_NetOp.m_Socket, 1000000); + + g_NetOp.Update(); + + while(g_NetOp.Recv(&Packet)) + { + if(Packet.m_DataSize >= (int)sizeof(SERVERBROWSE_INFO) && mem_comp(Packet.m_pData, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)) == 0) + { + // we got ze info + CUnpacker Up; + + Up.Reset((unsigned char*)Packet.m_pData+sizeof(SERVERBROWSE_INFO), Packet.m_DataSize-sizeof(SERVERBROWSE_INFO)); + int Token = str_toint(Up.GetString()); + if(Token != CurToken) + continue; + + int64 endTime = time_get(); + std::cout << (double)(endTime - startTime) / 1000 << " ms" << std::endl; + } + } +}