summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game.c4
-rw-r--r--src/net/client.c35
-rw-r--r--src/net/client.h13
-rw-r--r--src/net/comm.c54
-rw-r--r--src/net/comm.h10
-rw-r--r--src/net/server.c50
-rw-r--r--src/net/server.h18
7 files changed, 95 insertions, 89 deletions
diff --git a/src/game.c b/src/game.c
index e6291a0..eb157cf 100644
--- a/src/game.c
+++ b/src/game.c
@@ -276,8 +276,8 @@ void start_game(const bool servermode, const char* addr, const char* port)
strncpy(data->nickname, "nickname", 10);
net_send(sock, msg_type_hello, NULL);
net_recv(sock, msg_type_start_game);
- net_recv(sock, msg_type_deal_cards);
- net_recv(sock, msg_type_init_stacks);
+ net_recv(sock, msg_type_deal_hand);
+ net_recv(sock, msg_type_initial_stacks);
ui_init();
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 <stdint.h>
#include <stdbool.h>
+#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 <stdint.h>
#include <stdbool.h>
+// 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; i<players->count; 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; i<MAX_HAND_CARDS; i++)
- payload[i] = hand->cards[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; i<NUM_TABLE_STACKS; i++)
- payload[i] = ds->table_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 <stdint.h>
#include <stdbool.h>
+#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