From c2352ee043546b518f69c615a1ece778e942e650 Mon Sep 17 00:00:00 2001 From: Cara Salter Date: Thu, 20 Jan 2022 23:47:53 -0500 Subject: initial commit yay start of a state machine and also learning sockets --- src/server.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/server.c (limited to 'src/server.c') diff --git a/src/server.c b/src/server.c new file mode 100644 index 0000000..bee6153 --- /dev/null +++ b/src/server.c @@ -0,0 +1,84 @@ +#include "server.h" +#include "login.h" +#include +#include +#include +#include +#include +#include + +int server_listen(server_t *server) { + /* + ** + ** The `socket(2)` syscall returns a file descriptor for a socket + ** + ** it takes two arguments that we care about: + ** - domain -- AF_INET for IPv4 + ** - type -- SOCK_STREAM sequenced and reliable + ** + */ + int err = (server->listen_fd = socket(AF_INET, SOCK_STREAM, 0)); + + if (err == -1) { + perror("socket"); + printf("Failed to create socket"); + return err; + } + + struct sockaddr_in server_addr = {0}; + + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = htonl(INADDR_ANY); + server_addr.sin_port = htons(8000); + + err = bind(server->listen_fd, (struct sockaddr *)&server_addr, + sizeof(server_addr)); + if (err == -1) { + perror("bind"); + printf("Failed to bind socket\n"); + return err; + } + + err = listen(server->listen_fd, 100); + if (err == -1) { + perror("listen"); + printf("Failed to listen on socket\n"); + return err; + } + + return 0; +} + +int server_accept(server_t *server) { + int err = 0; + int conn_fd; + socklen_t client_len; + + struct sockaddr_in client_addr; + + client_len = sizeof(client_addr); + + for (;;) { + err = (conn_fd = accept(server->listen_fd, (struct sockaddr *)&client_addr, + &client_len)); + if (err == -1) { + perror("Accept"); + printf("failed accepting connection\n"); + return err; + } + + if (!fork()) { + handle_player(conn_fd); + } + } + + return err; +} + +int send_to_fd(int fd, char *msg) { + int err = 0; + + err = send(fd, msg, strlen(msg), 0); + + return err; +} -- cgit v1.2.3