forked from shvipin/gossip_protocol
/
server.c
106 lines (92 loc) · 2.55 KB
/
server.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
94
95
96
97
98
99
100
101
102
103
104
105
106
// Single Author info:
// djzager David J Zager
// Group info:
// skukret Sarthak Kukreti
// vsharma5 Vipin Sharma
// djzager David J Zager
#include "server.h"
/**
* Server function that listens for messages from clients
*/
void *server(void *token)
{
me.self = setupNode();
char message[BUFFER_LENGTH];
int numNodes = 0;
char *line = NULL;
size_t len = 0;
ssize_t read;
do {
//sleep(3);
me.endpoints_fp = fopen(ENDPOINTS, "a+");
} while (me.endpoints_fp == NULL);
while ((read = getline(&line, &len, me.endpoints_fp)) != -1) {
line[read - 1] = '\0';
read--;
numNodes++;
debug("Read %s from endpoints file", line);
}
me.id = numNodes;
debug("Done reading endpoints file, we have id: %d", me.id);
if (args.num_nodes - 1 == numNodes) {
debug("We are the last process");
me.last_process = TRUE;
}
fprintf(me.endpoints_fp, "%s\n", getNodeInfo(me.self));
debug("Node info written to endpoints file");
fclose(me.endpoints_fp);
if (!me.last_process) {
// wait for OK message
debug("Waiting for \"OK\" message");
if (recvfrom(me.self->socket, message, BUFFER_LENGTH, 0, NULL, NULL) == -1) {
log_err("Failed to receive message");
}
debug("Received message %s", message);
if (strcmp(message, "OK") == 0) {
debug("Got the \"OK\"");
}
}
pthread_barrier_wait(&me.barrier);
free(line);
server_listen(message);
}
/**
* Convert a message from a client into data we can use
*/
void decode(char *message)
{
debug("Start decoding message %s", message);
int i;
char *decoded_msg = strtok(message," ");
int numNodes = atoi(decoded_msg);
pthread_mutex_lock(&me.lock);
for (i = 0; i < numNodes; i++) {
int index = atoi(strtok(NULL," "));
int heartbeat = atoi(strtok(NULL," "));
if (me.neighbors[index].index != STATE_DEAD && me.neighbors[index].index != me.id && heartbeat > me.neighbors[index].heartbeat) {
debug("r_neighbors %d is more recent", index);
me.neighbors[index].index = index;
me.neighbors[index].heartbeat = heartbeat;
time(&me.neighbors[index].localtime);
}
}
pthread_mutex_unlock(&me.lock);
}
/**
* This function has one job, to listen for messages
*/
void server_listen(char *message)
{
while (TRUE) {
memset(message,'\0',BUFFER_LENGTH);
if (recvfrom(me.self->socket, message, BUFFER_LENGTH, 0, NULL, NULL) == -1) {
log_err("Failed to receive message");
}
debug("Received message %s", message);
if (!me.alive) {
debug("I am dead");
continue;
}
decode(message);
}
}