diff --git a/include/Client.h b/include/Client.h index 3de1a2d..17d2489 100644 --- a/include/Client.h +++ b/include/Client.h @@ -54,7 +54,8 @@ public: void SetIsGuest(bool NewIsGuest) { mIsGuest = NewIsGuest; } void SetIsSynced(bool NewIsSynced) { mIsSynced = NewIsSynced; } void SetIsSyncing(bool NewIsSyncing) { mIsSyncing = NewIsSyncing; } - void EnqueueMissedPacketDuringSyncing(const std::string& Packet) { mMissedPacketsDuringSyncing.push(Packet); } + void EnqueueMissedPacketDuringSyncing(const std::string& Packet); + [[nodiscard]] std::queue MissedPacketQueue(){ return mMissedPacketsDuringSyncing; } [[nodiscard]] size_t MissedPacketQueueSize() const { return mMissedPacketsDuringSyncing.size(); } void SetIsConnected(bool NewIsConnected) { mIsConnected = NewIsConnected; } [[nodiscard]] TServer& Server() const; @@ -66,6 +67,7 @@ private: bool mIsConnected = false; bool mIsSynced = false; bool mIsSyncing = false; + std::mutex mMissedPacketsMutex; std::queue mMissedPacketsDuringSyncing; std::set mIdentifiers; bool mIsGuest = false; @@ -73,7 +75,7 @@ private: TSetOfVehicleData mVehicleData; std::string mName = "Unknown Client"; SOCKET mSocket[2] { SOCKET(-1) }; - sockaddr_in mUDPAddress {}; // is this initialization OK? + sockaddr_in mUDPAddress {}; // is this initialization OK? yes it is std::string mRole; std::string mDID; int mStatus = 0; diff --git a/include/TTCPServer.h b/include/TTCPServer.h index 3316bfb..d0307a6 100644 --- a/include/TTCPServer.h +++ b/include/TTCPServer.h @@ -17,8 +17,8 @@ public: void operator()() override; bool TCPSend(TClient& c, const std::string& Data, bool IsSync = false); - void SendLarge(TClient& c, std::string Data); - void Respond(TClient& c, const std::string& MSG, bool Rel); + 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); diff --git a/src/Client.cpp b/src/Client.cpp index a8e1369..ff96c03 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -69,6 +69,11 @@ TServer& TClient::Server() const { return mServer; } +void TClient::EnqueueMissedPacketDuringSyncing(const std::string& Packet){ + std::unique_lock Lock(mMissedPacketsMutex); + mMissedPacketsDuringSyncing.push(Packet); +} + TClient::TClient(TServer& Server) : mServer(Server) , mLastPingTime(std::chrono::high_resolution_clock::now()) { diff --git a/src/TTCPServer.cpp b/src/TTCPServer.cpp index c78a195..59dec24 100644 --- a/src/TTCPServer.cpp +++ b/src/TTCPServer.cpp @@ -164,7 +164,12 @@ bool TTCPServer::TCPSend(TClient& c, const std::string& Data, bool IsSync) { if (c.IsSyncing() && !IsSync) { c.EnqueueMissedPacketDuringSyncing(Data); return true; - } else if (!c.IsSyncing() && c.IsSynced() && c.MissedPacketQueueSize() != 0) { + } else if (!c.IsSyncing() && c.IsSynced() && c.MissedPacketQueueSize() != 0 && !IsSync) { + while(c.MissedPacketQueueSize() > 0){ + std::string QData = c.MissedPacketQueue().front(); + c.MissedPacketQueue().pop(); + TCPSend(c, QData,true); + } } int32_t Size, Sent; std::string Send(4, 0); @@ -522,21 +527,21 @@ bool TTCPServer::TCPSendRaw(SOCKET C, char* Data, int32_t Size) { return true; } -void TTCPServer::SendLarge(TClient& c, std::string Data) { +void TTCPServer::SendLarge(TClient& c, std::string Data, bool isSync) { if (Data.length() > 400) { std::string CMP(Comp(Data)); Data = "ABG:" + CMP; } - TCPSend(c, Data); + TCPSend(c, Data, isSync); } -void TTCPServer::Respond(TClient& c, const std::string& MSG, bool Rel) { +void TTCPServer::Respond(TClient& c, const std::string& MSG, bool Rel, bool isSync) { char C = MSG.at(0); if (Rel || C == 'W' || C == 'Y' || C == 'V' || C == 'E') { if (C == 'O' || C == 'T' || MSG.length() > 1000) { SendLarge(c, MSG); } else { - TCPSend(c, MSG); + TCPSend(c, MSG, isSync); } } else { UDPServer().UDPSend(c, MSG); @@ -571,7 +576,7 @@ void TTCPServer::SyncClient(const std::weak_ptr& c) { Return = true; return false; } - Respond(*LockedClient, v.Data(), true); + Respond(*LockedClient, v.Data(), true, true); std::this_thread::sleep_for(std::chrono::seconds(2)); } }