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));
}
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; });
}
}

View File

@ -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; }

View File

@ -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;
};
}

View File

@ -8,6 +8,7 @@
#include "NetworkManager.h"
#include "NetworkMessage.h"
#include "PacketReader.h"
#include "logging/Logger.h"
#include <event2/event.h>
#include <event2/listener.h>
@ -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);
}
}

View File

@ -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<TCPSocket> m_socket;