#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; }