83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
|
#include <stdio.h>
|
||
|
|
||
|
#include "common.h"
|
||
|
#include "network.h"
|
||
|
#include "message.h"
|
||
|
|
||
|
CLIENT_ENET* cl_create_enet(CLIENT_ENET* enet)
|
||
|
{
|
||
|
if(!enet)
|
||
|
{
|
||
|
enet = (CLIENT_ENET*)malloc(sizeof(CLIENT_ENET));
|
||
|
show_message_error(enet, "Failed to allocate space for CLIENT_ENET");
|
||
|
}
|
||
|
|
||
|
show_message_error(enet_initialize() == 0, "Failed to allocate space for CLIENT_ENET");
|
||
|
|
||
|
int port = enet->port;
|
||
|
char host[20];
|
||
|
strncpy(host, enet->host, 20);
|
||
|
|
||
|
enet->client = enet_host_create(NULL, 1, 2, 0, 0);
|
||
|
show_message_error(enet->client, "Failed to client host create");
|
||
|
|
||
|
enet_address_set_host(&enet->address, host);
|
||
|
enet->address.port = port;
|
||
|
|
||
|
enet->server = enet_host_connect(enet->client, &enet->address, 2, 0);
|
||
|
show_message_error(enet->server, "Failed to server connect");
|
||
|
|
||
|
if (enet_host_service(enet->client, &enet->event, 5000) > 0 && enet->event.type == ENET_EVENT_TYPE_CONNECT)
|
||
|
{
|
||
|
enet->connect = true;
|
||
|
printf("Клиент: присоединён к серверу %x:%hu\n", enet->event.peer->address.host, enet->event.peer->address.port);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
enet->connect = false;
|
||
|
puts("Клиент: не удалось присоединиться к серверу");
|
||
|
enet_peer_reset(enet->server);
|
||
|
cl_destroy_enet(enet);
|
||
|
}
|
||
|
|
||
|
return enet;
|
||
|
}
|
||
|
|
||
|
void cl_free_enet(CLIENT_ENET* enet)
|
||
|
{
|
||
|
cl_destroy_enet(enet);
|
||
|
free(enet);
|
||
|
}
|
||
|
|
||
|
void cl_destroy_enet(CLIENT_ENET* enet)
|
||
|
{
|
||
|
enet_host_destroy(enet->client);
|
||
|
enet_deinitialize();
|
||
|
}
|
||
|
|
||
|
void cl_disconnect_enet(CLIENT_ENET* enet)
|
||
|
{
|
||
|
enet_peer_disconnect(enet->server, 0);
|
||
|
|
||
|
ENetEvent event;
|
||
|
|
||
|
while (enet_host_service (enet->client, &event, 3000) > 0)
|
||
|
switch (event.type)
|
||
|
{
|
||
|
case ENET_EVENT_TYPE_RECEIVE:
|
||
|
enet_packet_destroy(event.packet);
|
||
|
break;
|
||
|
case ENET_EVENT_TYPE_DISCONNECT:
|
||
|
puts("Клиент: успешное отсоединение");
|
||
|
return;
|
||
|
case ENET_EVENT_TYPE_NONE:
|
||
|
case ENET_EVENT_TYPE_CONNECT:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
enet_peer_reset(enet->server);
|
||
|
|
||
|
enet->connect = false;
|
||
|
cl_destroy_enet(enet);
|
||
|
}
|