diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2011-01-16 03:36:43 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2011-01-16 03:36:43 +0100 |
| commit | 08a3c0b9979857e708865d2756ba057bb1c664ee (patch) | |
| tree | 9afc39c05d3fce4080e425902c0c71a3af413e3c /src/net.c | |
| parent | 3a85f876ca899d2ea523dafc79e6d3735ed52611 (diff) | |
moved generic recv function to new file; use payload length inside packets instead of packet length
Diffstat (limited to 'src/net.c')
| -rw-r--r-- | src/net.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/net.c b/src/net.c new file mode 100644 index 0000000..d7222e1 --- /dev/null +++ b/src/net.c @@ -0,0 +1,45 @@ +#include <sys/types.h> +#include <sys/socket.h> +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#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; +} + |
