#pragma once #include "Client.h" #include "Common.h" #include "Compat.h" #include "IThreaded.h" #include "TServer.h" #include class TResourceManager; class TTCPServer : public IThreaded { public: explicit TTCPServer(TServer& Server, TPPSMonitor& PPSMonitor, TResourceManager& ResourceManager); //~TTCPServer(); void operator()() override; bool TCPSend(TClient& c, const std::string& Data, bool IsSync = false); void SendLarge(TClient& c, std::string Data, bool isSync = false); void Respond(TClient& c, const std::string& MSG, bool Rel, bool isSync = false); std::shared_ptr CreateClient(SOCKET TCPSock); std::string TCPRcv(TClient& c); void ClientKick(TClient& c, const std::string& R); void SetUDPServer(TUDPServer& UDPServer); TUDPServer& UDPServer() { return mUDPServer->get(); } void SyncClient(const std::weak_ptr& c); void Identify(SOCKET TCPSock); void Authentication(SOCKET TCPSock); bool CheckBytes(TClient& c, int32_t BytesRcv); void SyncResources(TClient& c); void UpdatePlayer(TClient& Client); private: std::optional> mUDPServer { std::nullopt }; TServer& mServer; TPPSMonitor& mPPSMonitor; TResourceManager& mResourceManager; bool mShutdown { false }; void HandleDownload(SOCKET TCPSock); void OnConnect(const std::weak_ptr& c); void TCPClient(const std::weak_ptr& c); int OpenID(); void OnDisconnect(const std::weak_ptr& ClientPtr, bool kicked); void Parse(TClient& c, const std::string& Packet); void SendFile(TClient& c, const std::string& Name); static bool TCPSendRaw(SOCKET C, char* Data, int32_t Size); static void SplitLoad(TClient& c, size_t Sent, size_t Size, bool D, const std::string& Name); };