#include #include #include #include #include #include "net.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_stack(&buf[2], payload_len, param); 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; }