summaryrefslogtreecommitdiff
path: root/src/net_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net_server.c')
-rw-r--r--src/net_server.c146
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
+}
+