#include #include #include #include #include #include "net.h" void* net_recv(int sock, msg_type_t wanted) { void* result = NULL; uint8_t peekbuf[2], type, payload_len, *packet, *payload; ssize_t len = recv(sock, peekbuf, 2, MSG_PEEK); // just peek into packet to determine type assert(len != -1); type = peekbuf[NET_MSG_OFFSET_TYPE]; payload_len = peekbuf[NET_MSG_OFFSET_PAYLOAD_LENGTH]; if(type != wanted) { printf("client_recv: received type %d instead of %d", type, wanted); return NULL; } packet = malloc(payload_len+NET_MSG_OFFSET_PAYLOAD); recv(sock, packet, payload_len+NET_MSG_OFFSET_PAYLOAD, 0); payload = &packet[NET_MSG_OFFSET_PAYLOAD]; switch(type) { case msg_type_hello: result = server_recv_hello(payload, payload_len); break; case msg_type_start_game: result = client_recv_player_list(payload, payload_len); break; case msg_type_deal_cards: result = client_recv_deal_cards(payload, payload_len); break; } free(packet); return result; }