#include "server.h" #include "login.h" #include #include #include #include #include #include #include static int socket_fd; void closeServer(int dummy) { shutdown(socket_fd, 2); } 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}; if (signal(SIGINT, closeServer) == SIG_ERR) { printf("Could not set signal handler\n"); return -1; } server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); if (setsockopt(server->listen_fd, SOL_SOCKET, SO_REUSEADDR,1,sizeof(1))) { printf("Could not set SO_REUSEADDR on server socket, continuing\n"); } 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; } socket_fd = server->listen_fd; err = listen(server->listen_fd, 100); if (err == -1) { perror("listen"); printf("Failed to listen on socket\n"); return err; } printf("Bound to port 8000\n"); 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)); printf("Accepting a new connection\n"); if (err == -1) { perror("Accept"); printf("failed accepting connection\n"); return err; } if (!fork()) { printf("Forking, let's go handle them!\n"); 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; }