From 9563ca807cacff851a06861a6a4cff8a37043b0e Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Sat, 15 Jan 2011 00:52:57 +0100 Subject: added function to retrieve userlist on client --- src/net.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- src/net.h | 2 -- src/player.h | 9 +++++++++ 3 files changed, 69 insertions(+), 7 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 #include #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; inames[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; inames[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; icount; 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; +} + diff --git a/src/net.h b/src/net.h index 2fb28c0..419febf 100644 --- a/src/net.h +++ b/src/net.h @@ -1,8 +1,6 @@ #ifndef OXEN_NET_H #define OXEN_NET_H -#define MAX_PLAYERS 10 - typedef enum { diff --git a/src/player.h b/src/player.h index 8b9059f..80f8df9 100644 --- a/src/player.h +++ b/src/player.h @@ -2,5 +2,14 @@ #define OXEN_PLAYER_H #define MAX_PLAYER_NAME_LENGTH 10 +#define MAX_PLAYERS 10 + +#include + +struct player_list +{ + uint8_t count; + char* names[MAX_PLAYERS]; +}; #endif // OXEN_PLAYER_H -- cgit v1.2.3