From 5f956e035e648901645fd43d2e28fc6f8c49a585 Mon Sep 17 00:00:00 2001 From: Mario Kilies Date: Mon, 24 Jan 2011 14:17:55 +0100 Subject: Huge refactoring of network related code. --- src/net/client.c | 35 ++++++++++++++++------------------- src/net/client.h | 13 +++++++------ src/net/comm.c | 54 ++++++++++++++++++++++++++++-------------------------- src/net/comm.h | 10 ++++++---- src/net/server.c | 50 +++++++++++++++++++++++++------------------------- src/net/server.h | 18 +++++++++++------- 6 files changed, 93 insertions(+), 87 deletions(-) (limited to 'src/net') diff --git a/src/net/client.c b/src/net/client.c index 2606bd4..46b4ec3 100644 --- a/src/net/client.c +++ b/src/net/client.c @@ -62,7 +62,7 @@ int client_connect_server(const char* host, const char* port) return sock; } -bool client_recv_player_list(const uint8_t* payload, const uint8_t data_len) +bool client_parse_player_list(const uint8_t* payload, const uint8_t data_len) { assert(payload != NULL); @@ -86,7 +86,7 @@ bool client_recv_player_list(const uint8_t* payload, const uint8_t data_len) return true; } -bool client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len) +bool client_parse_deal_hand(const uint8_t* payload, const uint8_t payload_len) { assert(payload != NULL); assert(payload_len == MAX_HAND_CARDS); // deal_cards packet have fixed size @@ -99,7 +99,7 @@ bool client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len) return true; } -bool client_recv_selected_stack(const uint8_t* payload, const uint8_t payload_len) +bool client_parse_selected_stack(const uint8_t* payload, const uint8_t payload_len) { assert(payload != NULL && payload_len == 1); @@ -111,7 +111,7 @@ bool client_recv_selected_stack(const uint8_t* payload, const uint8_t payload_le return true; } -bool client_recv_initial_stacks(const uint8_t* payload, const uint8_t payload_len) +bool client_parse_initial_stacks(const uint8_t* payload, const uint8_t payload_len) { assert(payload != NULL && payload_len == NUM_TABLE_STACKS); @@ -122,35 +122,32 @@ bool client_recv_initial_stacks(const uint8_t* payload, const uint8_t payload_le return true; } -uint8_t client_send_hello(uint8_t* payload, const uint8_t payload_len) +void client_prep_hello(msg_t *m) { data_store* ds = datamodel(); uint8_t namelen = strlen(ds->nickname); - - memcpy(payload, ds->nickname, namelen); - - return namelen; + m->hdr.type = msg_type_hello; + memcpy(m->payload, ds->nickname, namelen); + m->hdr.payload_length = namelen; } -uint8_t client_send_selected_card(uint8_t* payload, const uint8_t payload_len) +void client_prep_selected_card(msg_t *m) { data_store* ds = datamodel(); card c = ds->selected_card; - assert(c >= MIN_CARD && c <= MAX_CARD); - payload[0] = c; - - return 1; + m->hdr.type = msg_type_selected_card; + m->payload[0] = c; + m->hdr.payload_length = 1; } -uint8_t client_send_selected_stack(uint8_t* payload, const uint8_t payload_len) +void client_prep_selected_stack(msg_t *m) { data_store* ds = datamodel(); - - payload[0] = ds->stack_index; assert(ds->stack_index <= NUM_TABLE_STACKS); - return 1; + m->hdr.type = msg_type_selected_stack_c; + m->payload[0] = ds->stack_index; + m->hdr.payload_length = 1; } - diff --git a/src/net/client.h b/src/net/client.h index 31b3d30..deda2c0 100644 --- a/src/net/client.h +++ b/src/net/client.h @@ -3,13 +3,14 @@ #include #include +#include "comm.h" int client_connect_server(const char* host, const char* port); -uint8_t client_send_hello(uint8_t* payload, const uint8_t payload_len); -uint8_t client_send_selected_card(uint8_t* payload, const uint8_t payload_len); -uint8_t client_send_selected_stack(uint8_t* payload, const uint8_t payload_len); -bool client_recv_player_list(const uint8_t* payload, const uint8_t data_len); -bool client_recv_deal_cards(const uint8_t* payload, const uint8_t payload_len); -bool client_recv_selected_stack(const uint8_t* payload, const uint8_t payload_len); +void client_prep_hello(msg_t *m); +void client_prep_selected_card(msg_t *m); +void client_prep_selected_stack(msg_t *m); +bool client_parse_player_list(const uint8_t* payload, const uint8_t data_len); +bool client_parse_deal_hand(const uint8_t* payload, const uint8_t payload_len); +bool client_parse_selected_stack(const uint8_t* payload, const uint8_t payload_len); #endif // OXEN_CLIENT_H diff --git a/src/net/comm.c b/src/net/comm.c index 5a283db..cbcfc44 100644 --- a/src/net/comm.c +++ b/src/net/comm.c @@ -25,29 +25,31 @@ bool net_recv(int sock, const msg_type_t type) recv(sock, &m.hdr, sizeof(msg_header_t), 0); // Remove message header from socket recv(sock, m.payload, m.hdr.payload_length, 0);// And then receive the payload + printf("net_recv: received msg type %d with payload length %d\n", m.hdr.type, m.hdr.payload_length); + switch(type) { case msg_type_hello: - result = server_recv_hello(m.payload, m.hdr.payload_length); + result = server_parse_hello(m.payload, m.hdr.payload_length); break; case msg_type_start_game: - result = client_recv_player_list(m.payload, m.hdr.payload_length); + result = client_parse_player_list(m.payload, m.hdr.payload_length); break; - case msg_type_deal_cards: - result = client_recv_deal_cards(m.payload, m.hdr.payload_length); + case msg_type_deal_hand: + result = client_parse_deal_hand(m.payload, m.hdr.payload_length); break; - case msg_type_init_stacks: - printf("not yet implemented: msg_type_init_stacks\n"); + case msg_type_initial_stacks: + printf("not yet implemented: msg_type_initial_stacks\n"); exit(EXIT_FAILURE); break; case msg_type_selected_card: - result = server_recv_selected_card(m.payload, m.hdr.payload_length); + result = server_parse_selected_card(m.payload, m.hdr.payload_length); break; case msg_type_selected_stack_c: - result = server_recv_selected_stack(m.payload, m.hdr.payload_length); + result = server_parse_selected_stack(m.payload, m.hdr.payload_length); break; case msg_type_selected_stack_s: - result = client_recv_selected_stack(m.payload, m.hdr.payload_length); + result = client_parse_selected_stack(m.payload, m.hdr.payload_length); break; default: printf("net_recv: Unknown message type %d received!\n", type); @@ -60,47 +62,47 @@ bool net_recv(int sock, const msg_type_t type) return result; } -bool net_send(int sock, const msg_type_t type, void* param) +bool net_send(int sock, const msg_type_t type, void *data) { bool result = true; - uint8_t payload_len = 255; - uint8_t buf[payload_len+2]; // should be enough for all packet types - buf[0] = type; + msg_t m; + m.payload = malloc(NET_MSG_MAX_PAYLOAD_LENGTH); switch(type) { case msg_type_hello: - payload_len = client_send_hello(&buf[2], payload_len); + client_prep_hello(&m); break; case msg_type_selected_card: - payload_len = client_send_selected_card(&buf[2], payload_len); + client_prep_selected_card(&m); break; case msg_type_selected_stack_c: - payload_len = client_send_selected_stack(&buf[2], payload_len); + client_prep_selected_stack(&m); break; case msg_type_start_game: - payload_len = server_send_start_game(&buf[2], payload_len); + server_prep_start_game(&m); break; case msg_type_selected_stack_s: - payload_len = server_send_selected_stack(&buf[2], payload_len); + server_prep_selected_stack(&m); break; - case msg_type_deal_cards: - payload_len = server_send_deal_cards(&buf[2], payload_len, param); + case msg_type_deal_hand: + server_prep_deal_hand(&m, data); break; - case msg_type_initial_stack: - payload_len = server_send_initial_stacks(&buf[2], payload_len); + case msg_type_initial_stacks: + server_prep_initial_stacks(&m); break; default: - printf("net_send: Unknown message type %d received\n", type); + printf("net_send: Unknown message type %d given\n", type); exit(EXIT_FAILURE); break; } - buf[1] = payload_len; + printf("net_send: sending msg type %d with payload length %d\n", m.hdr.type, m.hdr.payload_length); + send(sock, &m, sizeof(msg_header_t), 0); // Send message header first + send(sock, m.payload, m.hdr.payload_length, 0); // Then send payload - send(sock, buf, payload_len+2, 0); + free(m.payload); return result; } - diff --git a/src/net/comm.h b/src/net/comm.h index 03816c8..b13d034 100644 --- a/src/net/comm.h +++ b/src/net/comm.h @@ -4,6 +4,9 @@ #include #include +// Specifies the maximum payload length in bytes +#define NET_MSG_MAX_PAYLOAD_LENGTH 255 + // Offsets within the receive buffer to easily access the data fields of the received message #define NET_MSG_OFFSET_TYPE 0 #define NET_MSG_OFFSET_PAYLOAD_LENGTH 1 @@ -14,12 +17,11 @@ typedef enum // Specify message type identifiers here msg_type_hello = 0x0, msg_type_start_game = 0x1, - msg_type_deal_cards = 0x2, - msg_type_init_stacks = 0x3, + msg_type_deal_hand = 0x2, + msg_type_initial_stacks = 0x3, msg_type_selected_card = 0x4, msg_type_selected_stack_c = 0x5, msg_type_selected_stack_s = 0x6, - msg_type_initial_stack = 0x7 } msg_type_t; // Header format @@ -38,6 +40,6 @@ typedef struct // generic network functions bool net_recv(int sock, msg_type_t wanted); -bool net_send(int sock, const msg_type_t type, void* param); +bool net_send(int sock, const msg_type_t type, void *data); #endif // OXEN_NET_H diff --git a/src/net/server.c b/src/net/server.c index 10d5d11..6154f98 100644 --- a/src/net/server.c +++ b/src/net/server.c @@ -107,7 +107,7 @@ void server_get_players(int serversock, socket_list_t* client_socks, const uint8 * @param[in] sock Socket to use * @return Username of client */ -bool server_recv_hello(const uint8_t* payload, const uint8_t payload_len) +bool server_parse_hello(const uint8_t* payload, const uint8_t payload_len) { assert(payload != NULL && payload_len < MAX_PLAYER_NAME_LENGTH && payload_len > 0); @@ -124,7 +124,7 @@ bool server_recv_hello(const uint8_t* payload, const uint8_t payload_len) return true; } -card* server_recv_selected_card(const uint8_t* payload, const uint8_t payload_len) +card* server_parse_selected_card(const uint8_t* payload, const uint8_t payload_len) { assert(payload != NULL && payload_len == 1); @@ -135,7 +135,7 @@ card* server_recv_selected_card(const uint8_t* payload, const uint8_t payload_le return c; } -uint8_t* server_recv_selected_stack(const uint8_t* payload, const uint8_t payload_len) +uint8_t* server_parse_selected_stack(const uint8_t* payload, const uint8_t payload_len) { assert(payload != NULL && payload_len == 1); @@ -146,57 +146,57 @@ uint8_t* server_recv_selected_stack(const uint8_t* payload, const uint8_t payloa return index; } -uint8_t server_send_start_game(uint8_t* payload, const uint8_t payload_len) +void server_prep_start_game(msg_t *m) { uint16_t pos = 0; data_store* ds = datamodel(); player_list* players = &ds->players; - payload[pos++] = players->count; + m->hdr.type = msg_type_start_game; + m->payload[pos++] = players->count; - // copy player_ids, length and nicknames to buffer + // copy player_ids, length and nicknames to message payload for(int i=0; icount; i++) { pnoc_t* pl = &players->players[i]; - payload[pos++] = pl->player_id; + m->payload[pos++] = pl->player_id; uint8_t len = strlen(pl->player_name); - payload[pos++] = len; - memcpy(payload+pos, pl->player_name, len); - payload += len; + m->payload[pos++] = len; + memcpy(m->payload+pos, pl->player_name, len); + pos += len; } - assert(pos <= payload_len); - - return pos; + m->hdr.payload_length = pos; } -uint8_t server_send_selected_stack(uint8_t* payload, const uint8_t payload_len) +void server_prep_selected_stack(msg_t *m) { data_store* ds = datamodel(); - payload[0] = ds->stack_index; - - return 1; + m->hdr.type = msg_type_selected_stack_s; + m->payload[0] = ds->stack_index; + m->hdr.payload_length = 1; } -uint8_t server_send_deal_cards(uint8_t* payload, const uint8_t payload_len, const void* param) +void server_prep_deal_hand(msg_t *m, const hand_t *h) { - const hand_t* hand = (hand_t*) param; + m->hdr.type = msg_type_deal_hand; for(int i=0; icards[i]; + m->payload[i] = h->cards[i]; - return MAX_HAND_CARDS; + m->hdr.payload_length = MAX_HAND_CARDS; } -uint8_t server_send_initial_stacks(uint8_t* payload, const uint8_t payload_len) +void server_prep_initial_stacks(msg_t *m) { data_store* ds = datamodel(); + m->hdr.type = msg_type_initial_stacks; + for(int i=0; itable_stacks.stacks[i].cards[0]; + m->payload[i] = ds->table_stacks.stacks[i].cards[0]; - return NUM_TABLE_STACKS; + m->hdr.payload_length = NUM_TABLE_STACKS; } - diff --git a/src/net/server.h b/src/net/server.h index 66bce9b..7856cee 100644 --- a/src/net/server.h +++ b/src/net/server.h @@ -3,7 +3,9 @@ #include #include +#include "comm.h" #include "../player.h" +#include "../hand.h" // Socket list typedef struct @@ -14,12 +16,14 @@ typedef struct int server_start(const char* port); void server_get_players(int serversock, socket_list_t* client_socks, const uint8_t count); -bool server_recv_hello(const uint8_t* payload, const uint8_t payload_len); -card* server_recv_selected_card(const uint8_t* payload, const uint8_t payload_len); -uint8_t* server_recv_selected_stack(const uint8_t* payload, const uint8_t payload_len); -uint8_t server_send_start_game(uint8_t* payload, const uint8_t payload_len); -uint8_t server_send_deal_cards(uint8_t* payload, const uint8_t payload_len, const void* param); -uint8_t server_send_selected_stack(uint8_t* payload, const uint8_t payload_len); -uint8_t server_send_initial_stacks(uint8_t* payload, const uint8_t payload_len); + +bool server_parse_hello(const uint8_t* payload, const uint8_t payload_len); +card* server_parse_selected_card(const uint8_t* payload, const uint8_t payload_len); +uint8_t* server_parse_selected_stack(const uint8_t* payload, const uint8_t payload_len); + +void server_prep_start_game(msg_t *m); +void server_prep_deal_hand(msg_t *m, const hand_t *h); +void server_prep_selected_stack(msg_t *m); +void server_prep_initial_stacks(msg_t *m); #endif // OXEN_SERVER_H -- cgit v1.2.3