diff options
Diffstat (limited to 'src/net/comm.c')
| -rw-r--r-- | src/net/comm.c | 106 |
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; +} + |
