diff options
Diffstat (limited to 'src/server.c')
-rw-r--r-- | src/server.c | 84 |
1 files changed, 84 insertions, 0 deletions
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 <netinet/in.h> +#include <stdio.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> + +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; +} |