Implement socket shutdown/closing

This commit is contained in:
Joshua Ashton 2020-08-01 04:54:31 +01:00
parent 134fd77247
commit cc03c321f3
5 changed files with 24 additions and 4 deletions

View File

@ -39,9 +39,9 @@ namespace Feather
clients.emplace_back(std::move(client)); 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(); 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; });
} }
} }

View File

@ -17,7 +17,7 @@ namespace Feather
~DedicatedServer(); ~DedicatedServer();
void OnClientConnect(Network::TCPClientHandle&& client) override; 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; } ServerStatus& GetStatus() { return m_status; }

View File

@ -9,6 +9,6 @@ namespace Feather::Network
{ {
public: public:
virtual void OnClientConnect(TCPClientHandle&& client) = 0; virtual void OnClientConnect(TCPClientHandle&& client) = 0;
virtual void OnClientDisconnect(const TCPClientHandle& client) = 0; virtual void OnClientDisconnect(const TCPClient* client) = 0;
}; };
} }

View File

@ -8,6 +8,7 @@
#include "NetworkManager.h" #include "NetworkManager.h"
#include "NetworkMessage.h" #include "NetworkMessage.h"
#include "PacketReader.h" #include "PacketReader.h"
#include "logging/Logger.h"
#include <event2/event.h> #include <event2/event.h>
#include <event2/listener.h> #include <event2/listener.h>
@ -151,6 +152,14 @@ namespace Feather::Network
void TCPClient::EventCallback(int16_t event) 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) void TCPClient::Write(const uint8_t* data, size_t size)
@ -200,4 +209,9 @@ namespace Feather::Network
TCPListener::~TCPListener() TCPListener::~TCPListener()
{ {
} }
void TCPListener::OnClientDisconnected(const TCPClient* client)
{
m_callbacks->OnClientDisconnect(client);
}
} }

View File

@ -12,6 +12,12 @@ namespace Feather::Network
public: public:
TCPListener(uint16_t port, IListenerInterface* callbacks); TCPListener(uint16_t port, IListenerInterface* callbacks);
~TCPListener(); ~TCPListener();
protected:
friend class TCPClient;
void OnClientDisconnected(const TCPClient* client);
private: private:
IListenerInterface* m_callbacks; IListenerInterface* m_callbacks;
std::unique_ptr<TCPSocket> m_socket; std::unique_ptr<TCPSocket> m_socket;