-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Master.c
93 lines (83 loc) · 3.3 KB
/
Master.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright DarkNeutrino 2021
#include <Server/Server.h>
#include <Server/Structs/ServerStruct.h>
#include <Util/Checks/PlayerChecks.h>
#include <Util/DataStream.h>
#include <Util/Log.h>
#include <Util/Types.h>
#include <Util/Uthash.h>
#include <enet/enet.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
void master_update(server_t* server)
{
server->protocol.num_users = 0;
player_t *connected_player, *tmp;
HASH_ITER(hh, server->players, connected_player, tmp)
{
if (is_past_join_screen(connected_player)) {
server->protocol.num_users++;
}
}
ENetPacket* packet = enet_packet_create(NULL, 1, ENET_PACKET_FLAG_RELIABLE);
stream_t stream = {packet->data, packet->dataLength, 0};
stream_write_u8(&stream, server->protocol.num_users);
enet_peer_send(server->master.peer, 0, packet);
}
int master_connect(server_t* server, uint16_t port)
{
server->master.client = enet_host_create(NULL, 1, 1, 0, 0);
enet_host_compress_with_range_coder(server->master.client);
if (server->master.client == NULL) {
fprintf(stderr, "An error occurred while trying to create an ENet client host!\n");
return EXIT_FAILURE;
}
ENetAddress address;
enet_address_set_host(&address, "67.205.183.163");
address.port = 32886;
LOG_STATUS("Connecting to master server");
server->master.peer = enet_host_connect(server->master.client, &address, 2, 31);
if (server->master.peer == NULL) {
fprintf(stderr, "ERROR: failed to create client\n");
return EXIT_FAILURE;
}
while (enet_host_service(server->master.client, &server->master.event, 1000) > 0) {
LOG_STATUS("Connection success");
ENetPacket* packet = enet_packet_create(NULL,
9 + strlen(server->server_name) + strlen(server->gamemode_name) +
strlen(server->map_name) + 3,
ENET_PACKET_FLAG_RELIABLE);
stream_t stream = {packet->data, packet->dataLength, 0};
stream_write_u8(&stream, 32);
stream_write_u16(&stream, port);
stream_write_array(&stream, server->server_name, strlen(server->server_name) + 1);
stream_write_array(&stream, server->gamemode_name, strlen(server->gamemode_name) + 1);
stream_write_array(&stream, server->map_name, strlen(server->map_name) + 1);
enet_peer_send(server->master.peer, 0, packet);
}
return 0;
}
void* master_keep_alive(void* p_server)
{
server_t* server = p_server;
while (server->running) {
if (server->master.enable_master_connection == 1) {
pthread_mutex_lock(&server_lock);
if (time(NULL) - server->master.time_since_last_send >= 1) {
if (enet_host_service(server->master.client, &server->master.event, 0) < 0) {
LOG_WARNING("Connection to master server lost. Waiting 30 seconds to reconnect...");
sleep(30);
master_connect(server, server->port);
}
server->master.time_since_last_send = time(NULL);
}
pthread_mutex_unlock(&server_lock);
}
sleep(0);
}
pthread_exit(0);
return NULL;
}