#pragma once #include "TCPCommon.h" namespace Feather::Network { using TCPSocketCallback = void(*)(evconnlistener* listener, SocketHandle socket, sockaddr* addr, int socklen, void* self); class TCPSocket { public: TCPSocket(); ~TCPSocket(); bool IsIPV6() const; bool MarkReusable(); bool MarkDualBind(); bool MarkNonBlocking(); bool Bind(uint16_t port); bool Close(); evconnlistener* Listen(TCPSocketCallback callback, void* self); template evconnlistener* Listen(TCPSocketCallback callback, T* self) { return Listen(callback, reinterpret_cast(self)); } bool IsValid() const; private: SocketHandle m_socket; bool m_ipv6; }; }