123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #include <cassert>
- #include "network/Client.h"
- Client::Client() : client(nullptr), connection(nullptr) {
- ENet::add();
- }
- Client::~Client() {
- disconnect();
- enet_host_destroy(client);
- ENet::remove();
- }
- Error Client::start() {
- assert(client == nullptr);
- if(ENet::hasError()) {
- return {"cannot initialize enet"};
- }
- client = enet_host_create(nullptr, 1, 2, 0, 0);
- if(client == nullptr) {
- return {"cannot create enet client host"};
- }
- return {};
- }
- Error Client::connect(const char* server, Port port, int timeout) {
- assert(client != nullptr);
- assert(connection == nullptr);
- ENetAddress address;
- ENetEvent event;
- enet_address_set_host(&address, server);
- address.port = port;
- connection = enet_host_connect(client, &address, 3, 0);
- if(connection == nullptr) {
- return {"server is not available"};
- }
- if(enet_host_service(client, &event, timeout) <= 0 ||
- event.type != ENET_EVENT_TYPE_CONNECT) {
- disconnect();
- return {"connection failed"};
- }
- return {};
- }
- void Client::disconnect() {
- if(connection == nullptr) {
- return;
- }
- ENetEvent e;
- enet_peer_disconnect(connection, 0);
- while(enet_host_service(client, &e, 3000) > 0) {
- switch(e.type) {
- case ENET_EVENT_TYPE_RECEIVE: enet_packet_destroy(e.packet); break;
- case ENET_EVENT_TYPE_DISCONNECT: connection = nullptr; return;
- default: break;
- }
- }
- enet_peer_reset(connection);
- connection = nullptr;
- }
- void Client::send(OutPacket& p) {
- assert(client != nullptr);
- if(p.packet != nullptr) {
- p.packet->dataLength = p.index;
- enet_peer_send(connection, p.channel, p.packet);
- p.packet = nullptr;
- }
- }
|