diff --git a/include/Client.h b/include/Client.h index 9ab2dc72..74831754 100644 --- a/include/Client.h +++ b/include/Client.h @@ -79,6 +79,7 @@ class TClient final { [[nodiscard]] const ip::tcp::socket& GetTCPSock() const { return mSocket; } [[nodiscard]] std::string GetRoles() const { return mRole; } [[nodiscard]] std::string GetName() const { return mName; } + [[nodiscard]] const std::string& GetIP() const { return mIP; } void SetUnicycleID(int ID) { mUnicycleID = ID; } void SetID(int ID) { mID = ID; } [[nodiscard]] int GetOpenCarID() const; @@ -121,6 +122,7 @@ class TClient final { TSetOfVehicleData mVehicleData; SparseArray mVehiclePosition; std::string mName = "Unknown Client"; + std::string mIP; ip::tcp::socket mSocket; ip::udp::endpoint mUDPAddress {}; int mUnicycleID = -1; diff --git a/src/Client.cpp b/src/Client.cpp index ed67945f..4f7db8f3 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -149,6 +149,11 @@ TClient::TClient(TServer& Server, ip::tcp::socket&& Socket) : mServer(Server) , mSocket(std::move(Socket)) , mLastPingTime(std::chrono::high_resolution_clock::now()) { + boost::system::error_code ec; + auto ep = mSocket.remote_endpoint(ec); + if (!ec) { + mIP = ep.address().to_string(); + } } TClient::~TClient() { diff --git a/src/TNetwork.cpp b/src/TNetwork.cpp index d0393e89..f01cb8f7 100644 --- a/src/TNetwork.cpp +++ b/src/TNetwork.cpp @@ -661,15 +661,16 @@ void TNetwork::DisconnectClient(const std::weak_ptr &c, const std::stri void TNetwork::DisconnectClient(TClient &c, const std::string &R) { if (c.IsDisconnected()) return; - std::string ClientIP = c.GetTCPSock().remote_endpoint().address().to_string(); - mClientMapMutex.lock(); - if (mClientMap[ClientIP] > 0) { - mClientMap[ClientIP]--; - } - if (mClientMap[ClientIP] == 0) { - mClientMap.erase(ClientIP); + const std::string& ClientIP = c.GetIP(); + if (!ClientIP.empty()) { + std::lock_guard lock(mClientMapMutex); + if (mClientMap[ClientIP] > 0) { + mClientMap[ClientIP]--; + } + if (mClientMap[ClientIP] == 0) { + mClientMap.erase(ClientIP); + } } - mClientMapMutex.unlock(); c.Disconnect(R); }