diff --git a/src/DedicatedServer.cpp b/src/DedicatedServer.cpp index b55a303..2284676 100644 --- a/src/DedicatedServer.cpp +++ b/src/DedicatedServer.cpp @@ -39,9 +39,9 @@ namespace Feather clients.emplace_back(std::move(client)); } - void DedicatedServer::OnClientDisconnect(const Network::TCPClientHandle& client) + void DedicatedServer::OnClientDisconnect(const Network::TCPClient* client) { auto [clients, lock] = m_clients.borrow(); - clients.remove_if([&](MinecraftClient& other) { return other.GetTCPClient() == client; }); + clients.remove_if([&](MinecraftClient& other) { return other.GetTCPClient().get() == client; }); } } diff --git a/src/DedicatedServer.h b/src/DedicatedServer.h index 14e4a65..8568997 100644 --- a/src/DedicatedServer.h +++ b/src/DedicatedServer.h @@ -17,7 +17,7 @@ namespace Feather ~DedicatedServer(); void OnClientConnect(Network::TCPClientHandle&& client) override; - void OnClientDisconnect(const Network::TCPClientHandle& client) override; + void OnClientDisconnect(const Network::TCPClient* client) override; ServerStatus& GetStatus() { return m_status; } diff --git a/src/network/IListenerInterface.h b/src/network/IListenerInterface.h index 277bdcb..6a4d249 100644 --- a/src/network/IListenerInterface.h +++ b/src/network/IListenerInterface.h @@ -9,6 +9,6 @@ namespace Feather::Network { public: virtual void OnClientConnect(TCPClientHandle&& client) = 0; - virtual void OnClientDisconnect(const TCPClientHandle& client) = 0; + virtual void OnClientDisconnect(const TCPClient* client) = 0; }; } diff --git a/src/network/TCPListener.cpp b/src/network/TCPListener.cpp index 200df88..d8a30c8 100644 --- a/src/network/TCPListener.cpp +++ b/src/network/TCPListener.cpp @@ -8,6 +8,7 @@ #include "NetworkManager.h" #include "NetworkMessage.h" #include "PacketReader.h" +#include "logging/Logger.h" #include #include @@ -151,6 +152,14 @@ namespace Feather::Network void TCPClient::EventCallback(int16_t event) { + if (event & BEV_EVENT_ERROR) + { + const char* errorString = evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()); + Log_Error("TCPClient: %s", errorString); + } + + if (event & BEV_EVENT_EOF) + m_parent->OnClientDisconnected(this); } void TCPClient::Write(const uint8_t* data, size_t size) @@ -200,4 +209,9 @@ namespace Feather::Network TCPListener::~TCPListener() { } + + void TCPListener::OnClientDisconnected(const TCPClient* client) + { + m_callbacks->OnClientDisconnect(client); + } } diff --git a/src/network/TCPListener.h b/src/network/TCPListener.h index 36d799e..570175c 100644 --- a/src/network/TCPListener.h +++ b/src/network/TCPListener.h @@ -12,6 +12,12 @@ namespace Feather::Network public: TCPListener(uint16_t port, IListenerInterface* callbacks); ~TCPListener(); + + protected: + + friend class TCPClient; + void OnClientDisconnected(const TCPClient* client); + private: IListenerInterface* m_callbacks; std::unique_ptr m_socket;