diff options
Diffstat (limited to 'src/net_server.c')
| -rw-r--r-- | src/net_server.c | 146 |
1 files changed, 50 insertions, 96 deletions
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 <assert.h> #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; i<count; i++) { - int sock; struct sockaddr_storage addr; socklen_t addrlen = sizeof(addr); - sock = accept(serversock, (struct sockaddr*) &addr, &addrlen); - if(sock == -1) + client_socks->sockets[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; i<usercount; i++) - // buflen += strlen(players->names[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; i<usercount; i++) - { - /* - buf[pos++] = i; // player_id - uint8_t len = strlen(players->names[i]); - buf[pos++] = len; - memcpy(buf+pos, players->names[i], len); - pos += len;*/ - } - - // send to all users - for(int i=0; i<clientcount; i++) - send(clients[i], buf, buflen, 0); - - free(buf); -} - -/** - * Server side function; broadcast a selected table stack to all clients - * @param[in] clients Array of sockets with connections to clients - * @param[in] clientcount Number of sockets/clients - * @param[in] stackindex Selected stack to broadcast - */ -void server_send_selected_stack(int* clients, const uint8_t clientcount, const uint8_t stackindex) -{ - assert(clients != NULL); - assert(stackindex <= NUM_TABLE_STACKS); - - uint8_t buf[3]; - buf[NET_MSG_OFFSET_TYPE] = msg_type_selected_stack_s; - buf[NET_MSG_OFFSET_PAYLOAD_LENGTH] = 1; - buf[NET_MSG_OFFSET_PAYLOAD] = stackindex; - - for(int i=0; i<clientcount; i++) - send(clients[i], buf, 3, 0); + client_socks->count = 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; i<players->count; 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; i<MAX_HAND_CARDS; i++) - buf[NET_MSG_OFFSET_PAYLOAD+i] = h->cards[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 +} + |
