summaryrefslogtreecommitdiff
path: root/src/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net.c')
-rw-r--r--src/net.c65
1 files changed, 60 insertions, 5 deletions
diff --git a/src/net.c b/src/net.c
index 1b3811d..722cb3c 100644
--- a/src/net.c
+++ b/src/net.c
@@ -7,6 +7,7 @@
#include <unistd.h>
#include <assert.h>
#include "net.h"
+#include "player.h"
/**
* Server side function; start server on specified port
@@ -185,15 +186,15 @@ int client_connect_server(const char* host, const char* port)
}
-void server_start_game(int* clients, const uint8_t clientcount, const char* usernames[])
+void server_start_game(int* clients, const uint8_t clientcount, const struct player_list* players)
{
uint8_t* buf;
- uint8_t usercount = clientcount + 1; // 1 more user (server) than clients
+ uint8_t usercount = players->count;
uint32_t pos = 0;
uint32_t buflen = 2 + usercount; // type + usercount + (usercount * len)
for(int i=0; i<usercount; i++)
- buflen += strlen(usernames[i]);
+ buflen += strlen(players->names[i]);
buf = malloc(buflen);
if(buf == NULL)
@@ -206,9 +207,9 @@ void server_start_game(int* clients, const uint8_t clientcount, const char* user
// copy usernames with length to buffer
for(int i=0; i<usercount; i++)
{
- uint8_t len = strlen(usernames[i]);
+ uint8_t len = strlen(players->names[i]);
buf[pos++] = len;
- memcpy(buf+pos, usernames[i], len);
+ memcpy(buf+pos, players->names[i], len);
pos += len;
}
@@ -275,3 +276,57 @@ void* server_recv(int sock, uint8_t wanted)
return result;
}
+struct player_list* client_recv_player_list(int sock)
+{
+ uint8_t buf[200];
+ struct player_list* players;
+ uint32_t pos;
+
+ recv(sock, buf, 200, 0);
+
+ assert(buf[0] == msg_type_start_game);
+
+ players = malloc(sizeof(struct player_list));
+ if(players == NULL)
+ {
+ printf("client_recv_player_list: Out of memory\n");
+ exit(EXIT_FAILURE);
+ }
+ players->count = buf[1];
+
+ pos = 2;
+ // read usernames from buffer
+ for(int i=0; i<players->count; i++)
+ {
+ uint8_t namelen = buf[pos++];
+ players->names[i] = malloc(namelen+1);
+ memcpy(players->names[i], buf+pos, namelen);
+ players->names[i][namelen] = '\0';
+ pos += namelen;
+ }
+
+ return players;
+}
+
+void* client_recv(int sock, uint8_t wanted)
+{
+ void* result = NULL;
+ uint8_t buf[10], type;
+ ssize_t len = recv(sock, buf, 10, MSG_PEEK); // just peek into packet to determine type
+
+ assert(len != -1);
+
+ type = buf[0];
+ if(type != wanted)
+ return NULL;
+
+ switch(type)
+ {
+ case msg_type_start_game:
+ result = client_recv_player_list(sock);
+ break;
+ }
+
+ return result;
+}
+