#pragma once #include "IThreaded.h" #include "RWMutex.h" #include #include #include #include class TClient; class TUDPServer; class TTCPServer; class TPPSMonitor; class TServer final { public: using TClientSet = std::unordered_set>; TServer(int argc, char** argv); std::weak_ptr InsertNewClient(); void RemoveClient(std::weak_ptr); // in Fn, return true to continue, return false to break void ForEachClient(const std::function)>& Fn); size_t ClientCount() const; static void GlobalParser(std::weak_ptr Client, std::string Packet, TPPSMonitor& PPSMonitor, TUDPServer& UDPServer, TTCPServer& TCPServer); static void HandleEvent(TClient& c, const std::string& Data); private: TClientSet mClients; mutable RWMutex mClientsMutex; static void ParseVehicle(TClient& c, const std::string& Pckt, TTCPServer& TCPServer, TUDPServer& UDPServer); static void Apply(TClient& c, int VID, const std::string& pckt); };