Files
Blitz2/src/blitz/network/EnetClient.cpp
2024-08-07 11:54:09 +02:00

65 lines
1.4 KiB
C++

#include <blitz/network/EnetClient.h>
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