diff options
| author | Mario Kilies <MarioKilies@GMX.net> | 2011-01-24 11:15:56 +0100 |
|---|---|---|
| committer | Mario Kilies <MarioKilies@GMX.net> | 2011-01-24 11:15:56 +0100 |
| commit | 6820c635353b25f12401f8610c140c8608051ded (patch) | |
| tree | ee3e2c284a7bae7e91d58422602259df827a1504 /src/net_server.c | |
| parent | 322ff55a41374e39731aa53dcf6028b09c7c39c9 (diff) | |
Source code refactoring. Moved net/client/server stuff to 'net' subfolder.
Diffstat (limited to 'src/net_server.c')
| -rw-r--r-- | src/net_server.c | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/src/net_server.c b/src/net_server.c deleted file mode 100644 index 327a695..0000000 --- a/src/net_server.c +++ /dev/null @@ -1,203 +0,0 @@ -#include <sys/types.h> -#include <sys/socket.h> -#include <netdb.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <assert.h> -#include "net.h" -#include "player.h" -#include "global.h" - -/** - * Server side function; start server on specified port - * @param[in] port Port on which server should listen - * @return Listening socket - */ -int server_start(const char* port) -{ - assert(port != NULL); - - int status; - int serversock; - struct addrinfo hints, *result, *tmp; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; // IPv4 or IPv6 - hints.ai_socktype = SOCK_STREAM; // TCP socket - hints.ai_flags = AI_PASSIVE; // wildcard IP - hints.ai_protocol = 0; // any protocol - - status = getaddrinfo(NULL, port, &hints, &result); - if(status != 0) - { - printf("getaddrinfo: %s\n", gai_strerror(status)); - exit(EXIT_FAILURE); - } - - // iterate over linked addrinfo list and use first useable entry - for(tmp = result; tmp != NULL; tmp = tmp->ai_next) - { - int yes=1; - - // create socket - serversock = socket(tmp->ai_family, tmp->ai_socktype, tmp->ai_protocol); - if(serversock == -1) - continue; - - // try to reuse still open sockets in TIME_WAIT state - setsockopt(serversock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); - - // try to bind to address/port - if(bind(serversock, tmp->ai_addr, tmp->ai_addrlen) == 0) - break; // Success! - - close(serversock); - } - - if(tmp == NULL) - { - printf("failed to bind\n"); - exit(EXIT_FAILURE); - } - freeaddrinfo(result); - - // start listening - status = listen(serversock, 1); - if(status == -1) - { - printf("listen: %s\n", strerror(status)); - exit(EXIT_FAILURE); - } - - return serversock; -} - -/** - * 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 - */ -void server_get_players(int serversock, socket_list_t* client_socks, const uint8_t count) -{ - int i; - - assert(count < MAX_PLAYERS && count > 0); - - // accept connections - for(i=0; i<count; i++) - { - struct sockaddr_storage addr; - socklen_t addrlen = sizeof(addr); - client_socks->sockets[i] = accept(serversock, (struct sockaddr*) &addr, &addrlen); - if(client_socks->sockets[i] == -1) - { - 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); - } - client_socks->count = count; -} - -/** - * Server side function; receive hello message from client and read username - * @param[in] sock Socket to use - * @return Username of client - */ -bool server_recv_hello(const uint8_t* payload, const uint8_t payload_len) -{ - assert(payload != NULL && payload_len < MAX_PLAYER_NAME_LENGTH && payload_len > 0); - - data_store* ds = datamodel(); - - for(int i=0; i<ds->players.count; i++) - { - if(strlen(ds->players.players[i].player_name) > 0) // search for first empty (not yet assigned) slot - continue; - memcpy(ds->players.players[i].player_name, payload, payload_len); - ds->players.players[i].player_name[payload_len] = '\0'; - } - - return true; -} - -card* server_recv_selected_card(const uint8_t* payload, const uint8_t payload_len) -{ - assert(payload != NULL && payload_len == 1); - - card* c = malloc(sizeof(card)); - assert(c != NULL); - *c = payload[0]; - - return c; -} - -uint8_t* server_recv_selected_stack(const uint8_t* payload, const uint8_t payload_len) -{ - assert(payload != NULL && payload_len == 1); - - uint8_t* index = malloc(sizeof(uint8_t)); - assert(index != NULL); - *index = payload[0]; - - return index; -} - -uint8_t server_send_start_game(uint8_t* payload, const uint8_t payload_len) -{ - uint16_t pos = 0; - data_store* ds = datamodel(); - player_list* players = &ds->players; - - 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; - - for(int i=0; i<MAX_HAND_CARDS; i++) - payload[i] = hand->cards[i]; - - return MAX_HAND_CARDS; -} - - -uint8_t server_send_initial_stacks(uint8_t* payload, const uint8_t payload_len) -{ - data_store* ds = datamodel(); - - for(int i=0; i<NUM_TABLE_STACKS; i++) - payload[i] = ds->table_stacks.stacks[i].cards[0]; - - return NUM_TABLE_STACKS; -} - |
