#include "server.h" #include "login.h" #include "log.h" #include #include #include #include #include #include #include static int socket_fd; void closeServer(int dummy) { close(socket_fd); info("Caught SIGINT\n"); } 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"); error("Failed to create socket"); return err; } struct sockaddr_in server_addr = {0}; /* * if (signal(SIGINT, closeServer) == SIG_ERR) { error("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,(int*)1,1)) { debug("Could not set SO_REUSEADDR on server socket, continuing"); } err = bind(server->listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (err == -1) { perror("bind"); error("Failed to bind socket\n"); return err; } socket_fd = server->listen_fd; err = listen(server->listen_fd, 100); if (err == -1) { perror("listen"); error("Failed to listen on socket\n"); return err; } info("Bound to port 8000"); 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)); debug("Accepting a new connection"); if (err == -1) { perror("Accept"); error("failed accepting connection"); return err; } if (!fork()) { debug("Forking, let's go handle them!"); 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; }