diff options
Diffstat (limited to 'src/versionsrv/versionsrv.cpp')
| -rw-r--r-- | src/versionsrv/versionsrv.cpp | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/src/versionsrv/versionsrv.cpp b/src/versionsrv/versionsrv.cpp index 1ca3835f..d36fba3b 100644 --- a/src/versionsrv/versionsrv.cpp +++ b/src/versionsrv/versionsrv.cpp @@ -6,8 +6,54 @@ #include "versionsrv.h" +enum { + MAX_MAPS_PER_PACKET=48, + MAX_PACKETS=16, + MAX_MAPS=MAX_MAPS_PER_PACKET*MAX_PACKETS, +}; + +struct CPacketData +{ + int m_Size; + struct { + unsigned char m_aHeader[sizeof(VERSIONSRV_MAPLIST)]; + CMapVersion m_aMaplist[MAX_MAPS_PER_PACKET]; + } m_Data; +}; + +CPacketData m_aPackets[MAX_PACKETS]; +static int m_NumPackets = 0; + static CNetClient g_NetOp; // main +void BuildPackets() +{ + CMapVersion *pCurrent = &s_aMapVersionList[0]; + int ServersLeft = s_NumMapVersionItems; + m_NumPackets = 0; + while(ServersLeft && m_NumPackets < MAX_PACKETS) + { + int Chunk = ServersLeft; + if(Chunk > MAX_MAPS_PER_PACKET) + Chunk = MAX_MAPS_PER_PACKET; + ServersLeft -= Chunk; + + // copy header + mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST)); + + // copy map versions + for(int i = 0; i < Chunk; i++) + { + m_aPackets[m_NumPackets].m_Data.m_aMaplist[i] = *pCurrent; + pCurrent++; + } + + m_aPackets[m_NumPackets].m_Size = sizeof(VERSIONSRV_MAPLIST) + sizeof(CMapVersion)*Chunk; + + m_NumPackets++; + } +} + void SendVer(NETADDR *pAddr) { CNetChunk p; @@ -33,8 +79,15 @@ int main(int argc, char **argv) // ignore_convention net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); + BindAddr.type = NETTYPE_ALL; BindAddr.port = VERSIONSRV_PORT; - g_NetOp.Open(BindAddr, 0); + if(!g_NetOp.Open(BindAddr, 0)) + { + dbg_msg("mastersrv", "couldn't start network"); + return -1; + } + + BuildPackets(); dbg_msg("versionsrv", "started"); @@ -51,6 +104,22 @@ int main(int argc, char **argv) // ignore_convention { SendVer(&Packet.m_Address); } + + if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) && + mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0) + { + CNetChunk p; + p.m_ClientID = -1; + p.m_Address = Packet.m_Address; + p.m_Flags = NETSENDFLAG_CONNLESS; + + for(int i = 0; i < m_NumPackets; i++) + { + p.m_DataSize = m_aPackets[i].m_Size; + p.m_pData = &m_aPackets[i].m_Data; + g_NetOp.Send(&p); + } + } } // be nice to the CPU |