diff options
Diffstat (limited to 'src/net.c')
| -rw-r--r-- | src/net.c | 65 |
1 files changed, 60 insertions, 5 deletions
@@ -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; +} + |
