#include namespace blitz { namespace network { EnetClient::EnetClient(const Nz::IpAddress& address) : m_Running(true) { m_Host.Create(address.GetProtocol() == Nz::NetProtocol::IPv4 ? Nz::IpAddress::LoopbackIpV4 : Nz::IpAddress::LoopbackIpV6, 1); m_Peer = m_Host.Connect(address); m_Thread = std::jthread(&EnetClient::WorkerThread, this); m_Connection.SetPeer(m_Peer); } EnetClient::~EnetClient() { if (m_Peer->IsConnected()) Disconnect(); m_Running = false; m_Thread.request_stop(); m_Host.Destroy(); } void EnetClient::Disconnect() { m_Peer->DisconnectNow(0); m_Connection.SetPeer(nullptr); } void EnetClient::WorkerThread() { while (m_Running) { Update(); } } void EnetClient::Update() { Nz::ENetEvent event; int service = m_Host.Service(&event, 5); if (service > 0) { do { switch (event.type) { case Nz::ENetEventType::Disconnect: OnDisconnect(); break; case Nz::ENetEventType::DisconnectTimeout: OnDisconnectTimeout(); break; case Nz::ENetEventType::OutgoingConnect: OnConnect(); break; case Nz::ENetEventType::Receive: m_Connection.Recieve(event.packet.m_packet->data); break; case Nz::ENetEventType::None: case Nz::ENetEventType::IncomingConnect: break; } } while (m_Host.CheckEvents(&event)); } } } // namespace network } // namespace blitz