From bee6fde1a755d4b7a2afbaf9a1019b09c346e482 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sun, 2 Aug 2020 00:35:54 +0100 Subject: [PATCH] Log connection/disconnect properly --- src/DedicatedServer.cpp | 6 +++++ src/network/SocketAddress.h | 18 +++++++++++++++ src/network/TCPClient.h | 9 ++++++-- src/network/TCPCommon.h | 3 +++ src/network/TCPListener.cpp | 44 ++++++++++++++----------------------- 5 files changed, 50 insertions(+), 30 deletions(-) create mode 100644 src/network/SocketAddress.h diff --git a/src/DedicatedServer.cpp b/src/DedicatedServer.cpp index 6725c6d..96e7e9d 100644 --- a/src/DedicatedServer.cpp +++ b/src/DedicatedServer.cpp @@ -41,12 +41,18 @@ namespace Feather void DedicatedServer::OnClientConnect(Network::TCPClientHandle&& client) { + const auto& address = client->GetAddress(); + Log_Info("New connection from %s:%hu", address.ip, address.port); + auto [clients, lock] = m_clients.borrow(); clients.emplace_back(std::move(client)); } void DedicatedServer::OnClientDisconnect(const Network::TCPClient* client) { + const auto& address = client->GetAddress(); + Log_Info("Disconnected from %s:%hu", address.ip, address.port); + auto [clients, lock] = m_clients.borrow(); clients.remove_if([&](MinecraftClient& other) { return other.GetTCPClient().get() == client; }); } diff --git a/src/network/SocketAddress.h b/src/network/SocketAddress.h new file mode 100644 index 0000000..113771e --- /dev/null +++ b/src/network/SocketAddress.h @@ -0,0 +1,18 @@ +#pragma once + +#include "TCPCommon.h" +#include + +namespace Feather::Network +{ + struct SocketAddress + { + static constexpr size_t AddressLength = 65; + + SocketAddress(sockaddr* addr); + + uint16_t port; + char ip[AddressLength]; + }; + +} \ No newline at end of file diff --git a/src/network/TCPClient.h b/src/network/TCPClient.h index c36eb2f..c651449 100644 --- a/src/network/TCPClient.h +++ b/src/network/TCPClient.h @@ -2,6 +2,7 @@ #include "Lockable.h" #include "TCPCommon.h" +#include "SocketAddress.h" #include #include @@ -11,7 +12,7 @@ namespace Feather::Network class TCPClient { public: - TCPClient(TCPListener* parent, SocketHandle socket); + TCPClient(TCPListener* parent, SocketHandle socket, SocketAddress&& addr); ~TCPClient(); void ReadCallback(); @@ -19,7 +20,9 @@ namespace Feather::Network void EventCallback(int16_t event); void Write(const uint8_t* data, size_t size); - LockableVector& GetData(); + + LockableVector& GetData() { return m_data; } + const SocketAddress& GetAddress() const { return m_address; } private: TCPListener* m_parent; @@ -27,5 +30,7 @@ namespace Feather::Network bufferevent* m_bufferEvent; LockableVector m_data; + + SocketAddress m_address; }; } \ No newline at end of file diff --git a/src/network/TCPCommon.h b/src/network/TCPCommon.h index 8667c19..3deaeda 100644 --- a/src/network/TCPCommon.h +++ b/src/network/TCPCommon.h @@ -4,6 +4,7 @@ #include struct bufferevent; +struct sockaddr; namespace Feather::Network { @@ -13,6 +14,8 @@ namespace Feather::Network using SocketHandle = int; #endif + struct SocketAddress; + class IListenerInterface; class TCPListener; class TCPSocket; diff --git a/src/network/TCPListener.cpp b/src/network/TCPListener.cpp index 859cb82..b912315 100644 --- a/src/network/TCPListener.cpp +++ b/src/network/TCPListener.cpp @@ -21,27 +21,23 @@ namespace Feather::Network { - namespace + SocketAddress::SocketAddress(sockaddr* addr) { - template - void WriteIP(char(&outIP)[N], uint16_t& outPort, sockaddr* addr) + if (addr->sa_family == AF_INET) { - if (addr->sa_family == AF_INET) - { - auto sin = reinterpret_cast(addr); - evutil_inet_ntop(addr->sa_family, &sin->sin_addr, - outIP, sizeof(outIP)); + auto sin = reinterpret_cast(addr); + evutil_inet_ntop(sin->sin_family, &sin->sin_addr, + ip, sizeof(ip)); - outPort = sin->sin_port; - } - else - { - auto sin = reinterpret_cast(addr); - evutil_inet_ntop(addr->sa_family, &sin->sin6_addr, - outIP, sizeof(outIP)); + port = sin->sin_port; + } + else + { + auto sin = reinterpret_cast(addr); + evutil_inet_ntop(sin->sin6_family, &sin->sin6_addr, + ip, sizeof(ip)); - outPort = sin->sin6_port; - } + port = sin->sin6_port; } } @@ -136,9 +132,10 @@ namespace Feather::Network bool m_ipv6; }; - TCPClient::TCPClient(TCPListener* parent, SocketHandle socket) + TCPClient::TCPClient(TCPListener* parent, SocketHandle socket, SocketAddress&& addr) : m_parent(parent) , m_bufferEvent(bufferevent_socket_new(NetworkManager::Instance().GetEventBase(), socket, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE | BEV_OPT_DEFER_CALLBACKS | BEV_OPT_UNLOCK_CALLBACKS)) + , m_address(std::move(addr)) { bufferevent_setcb(m_bufferEvent, [](bufferevent* be, void* self) { static_cast(self)->ReadCallback(); }, @@ -189,11 +186,6 @@ namespace Feather::Network Log_Error("Failed to write to socket, size: " PRIuPTR ".", size); } - LockableVector& TCPClient::GetData() - { - return m_data; - } - TCPListener::TCPListener(uint16_t port, IListenerInterface* callbacks) : m_callbacks(callbacks) { @@ -232,12 +224,8 @@ namespace Feather::Network auto ListenerCallback = [](evconnlistener* evListener, SocketHandle socket, sockaddr* addr, int len, void* self) { - char ipAddress[INET6_ADDRSTRLEN]; uint16_t port; - WriteIP(ipAddress, port, addr); - Log_Info("Connection from: %s:%hu", ipAddress, port); - TCPListener* listener = static_cast(self); - listener->OnClientConnect(std::make_unique(listener, socket)); + listener->OnClientConnect(std::make_unique(listener, socket, addr)); }; if (!socket->Listen(ListenerCallback, this))