summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2011-01-15 00:52:57 +0100
committerReiner Herrmann <reiner@reiner-h.de>2011-01-15 00:52:57 +0100
commit9563ca807cacff851a06861a6a4cff8a37043b0e (patch)
tree2afd04b64d461ad4fe9cee82fe322b67a5ae5560
parent22a3b4d27084a93197f82c88a8dc954b49672bd9 (diff)
added function to retrieve userlist on client
-rw-r--r--src/net.c65
-rw-r--r--src/net.h2
-rw-r--r--src/player.h9
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 <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;
+}
+
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 <stdint.h>
+
+struct player_list
+{
+ uint8_t count;
+ char* names[MAX_PLAYERS];
+};
#endif // OXEN_PLAYER_H