65 lines
1.4 KiB
C++
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
|