summaryrefslogtreecommitdiff
path: root/src/net/comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/comm.c')
-rw-r--r--src/net/comm.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/net/comm.c b/src/net/comm.c
new file mode 100644
index 0000000..5a283db
--- /dev/null
+++ b/src/net/comm.c
@@ -0,0 +1,106 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "comm.h"
+#include "client.h"
+#include "server.h"
+
+bool net_recv(int sock, const msg_type_t type)
+{
+ msg_t m;
+ bool result;
+ ssize_t len = recv(sock, &m.hdr, sizeof(msg_header_t), MSG_PEEK); // just peek into packet to determine message header
+
+ assert(len != -1);
+
+ if(m.hdr.type != type)
+ {
+ printf("net_recv: received message type %d instead of %d", m.hdr.type, type);
+ return false;
+ }
+
+ m.payload = malloc(m.hdr.payload_length); // Allocate space for message payload
+ 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
+
+ switch(type)
+ {
+ case msg_type_hello:
+ result = server_recv_hello(m.payload, m.hdr.payload_length);
+ break;
+ case msg_type_start_game:
+ result = client_recv_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);
+ break;
+ case msg_type_init_stacks:
+ printf("not yet implemented: msg_type_init_stacks\n");
+ exit(EXIT_FAILURE);
+ break;
+ case msg_type_selected_card:
+ result = server_recv_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);
+ break;
+ case msg_type_selected_stack_s:
+ result = client_recv_selected_stack(m.payload, m.hdr.payload_length);
+ break;
+ default:
+ printf("net_recv: Unknown message type %d received!\n", type);
+ exit(EXIT_FAILURE);
+ break;
+ }
+
+ free(m.payload);
+
+ return result;
+}
+
+bool net_send(int sock, const msg_type_t type, void* param)
+{
+ bool result = true;
+ uint8_t payload_len = 255;
+ uint8_t buf[payload_len+2]; // should be enough for all packet types
+
+ buf[0] = type;
+
+ switch(type)
+ {
+ case msg_type_hello:
+ payload_len = client_send_hello(&buf[2], payload_len);
+ break;
+ case msg_type_selected_card:
+ payload_len = client_send_selected_card(&buf[2], payload_len);
+ break;
+ case msg_type_selected_stack_c:
+ payload_len = client_send_selected_stack(&buf[2], payload_len);
+ break;
+ case msg_type_start_game:
+ payload_len = server_send_start_game(&buf[2], payload_len);
+ break;
+ case msg_type_selected_stack_s:
+ payload_len = server_send_selected_stack(&buf[2], payload_len);
+ break;
+ case msg_type_deal_cards:
+ payload_len = server_send_deal_cards(&buf[2], payload_len, param);
+ break;
+ case msg_type_initial_stack:
+ payload_len = server_send_initial_stacks(&buf[2], payload_len);
+ break;
+ default:
+ printf("net_send: Unknown message type %d received\n", type);
+ exit(EXIT_FAILURE);
+ break;
+ }
+
+ buf[1] = payload_len;
+
+ send(sock, buf, payload_len+2, 0);
+
+ return result;
+}
+