From 2bd0e560986c66406bae90ff44f2dd6d3fec17be Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Sun, 23 Jan 2011 22:46:29 +0100 Subject: added generic net_send function and adapted functions it is using --- src/net_server.c | 146 +++++++++++++++++++------------------------------------ 1 file changed, 50 insertions(+), 96 deletions(-) (limited to 'src/net_server.c') diff --git a/src/net_server.c b/src/net_server.c index 52dca17..a7f6c48 100644 --- a/src/net_server.c +++ b/src/net_server.c @@ -8,6 +8,7 @@ #include #include "net.h" #include "player.h" +#include "global.h" /** * Server side function; start server on specified port @@ -76,108 +77,30 @@ int server_start(const char* port) /** * Server side function; accepts connections from clients * @param[in] serversock Socket on which server is listening + * @param[out] client_socks Socket list in which to store open client connections * @param[in] count Number of clients that should connect - * @return List of $count open sockets with connections to clients */ -int* server_get_players(int serversock, const uint8_t count) +void server_get_players(int serversock, socket_list_t* client_socks, const uint8_t count) { - int* clientsocks; int i; assert(count < MAX_PLAYERS && count > 0); - clientsocks = malloc(count*sizeof(int)); - if(clientsocks == NULL) - { - printf("server_get_players: Out of memory\n"); - exit(EXIT_FAILURE); - } - // accept connections for(i=0; isockets[i] = accept(serversock, (struct sockaddr*) &addr, &addrlen); + if(client_socks->sockets[i] == -1) { - printf("accept: %s\n", strerror(sock)); + printf("accept: %s\n", strerror(client_socks->sockets[i])); exit(EXIT_FAILURE); } //printf("new client connected: %s\n", inet_ntop(sock.ss_family, get_in_addr((struct sockaddr*)&sock), INET6_ADDRSTRLEN)); printf("new client connected (%d/%d)\n", i+1, count); - clientsocks[i] = sock; } - - return clientsocks; -} - -/** - * Server side function; notifies players of game start and send list of all players - * @param[in] clients List of sockets with connection to clients - * @param[in] clientcount Number of clients - * @param[in] players List of all players (including self) to send - */ -void server_start_game(int* clients, const uint8_t clientcount, const player_list* players) -{ - assert(clients != NULL); - assert(players != NULL); - - uint8_t* buf; - uint8_t usercount = players->count; - uint32_t pos; - uint32_t buflen = 3 + 2*usercount; // type + packetlen + usercount + (usercount * player_id) + (usercount * len) - - //for(int i=0; inames[i]); - - buf = malloc(buflen); - if(buf == NULL) - { - printf("server_start_game: Out of memory\n"); - exit(EXIT_FAILURE); - } - buf[NET_MSG_OFFSET_TYPE] = msg_type_start_game; - buf[NET_MSG_OFFSET_PAYLOAD_LENGTH] = buflen - 2; - pos = NET_MSG_OFFSET_PAYLOAD; - buf[pos++] = players->count; - // copy usernames with length to buffer - for(int i=0; inames[i]); - buf[pos++] = len; - memcpy(buf+pos, players->names[i], len); - pos += len;*/ - } - - // send to all users - for(int i=0; icount = count; } /** @@ -226,21 +149,52 @@ uint8_t* server_recv_selected_stack(const uint8_t* payload, const uint8_t payloa return index; } -/** - * Server side function; deal cards to a client (send hand) - * @param[in] sock Socket to use - * @param[in] h Hand to send - */ -void server_deal_cards(int sock, const hand_t *h) +uint8_t server_send_start_game(uint8_t* payload, const uint8_t payload_len) { - assert(h != NULL); + uint16_t pos = 0; + data_store* ds = datamodel(); + player_list* players = &ds->players; - uint8_t buf[2+MAX_HAND_CARDS]; + payload[pos++] = players->count; + + // copy player_ids, length and nicknames to buffer + for(int i=0; icount; i++) + { + pnoc_t* pl = &players->players[i]; + payload[pos++] = pl->player_id; + uint8_t len = strlen(pl->player_name); + payload[pos++] = len; + memcpy(payload+pos, pl->player_name, len); + payload += len; + } + + assert(pos <= payload_len); + + return pos; +} + +uint8_t server_send_selected_stack(uint8_t* payload, const uint8_t payload_len) +{ + data_store* ds = datamodel(); + + payload[0] = ds->stack_index; + + return 1; +} + +uint8_t server_send_deal_cards(uint8_t* payload, const uint8_t payload_len, const void* param) +{ + const hand_t* hand = (hand_t*) param; - buf[NET_MSG_OFFSET_TYPE] = msg_type_deal_cards; - buf[NET_MSG_OFFSET_PAYLOAD_LENGTH] = MAX_HAND_CARDS; for(int i=0; icards[i]; + payload[i] = hand->cards[i]; - send(sock, buf, 2+MAX_HAND_CARDS, 0); + return MAX_HAND_CARDS; } + + +uint8_t server_send_initial_stacks(uint8_t* payload, const uint8_t payload_len) +{ +// TODO +} + -- cgit v1.2.3