int server_process_connections(event_t event) { int fd, i; struct sockaddr *addr; socklen_t addrlen = sizeof(addr); int res = 0; if (max_passive_cycles && current_passive_cycles >= max_passive_cycles) ndprintf_die(stdout, "[INFO] Terminated on client connection timeout\n"); current_passive_cycles++; charge_timer(); update_display(); update_display_msg("Waiting for connections"); process_robots(0); /* TODO: This is horrible. We should just poll for an incoming * connection, data on existing fd, a keypress, or X event, not * looping like hell. */ fd = accept(sockd, (struct sockaddr *) &addr, &addrlen); if (fd >= 0) { if (max_robots == MAX_ROBOTS) { ndprintf(stdout, "[INFO] Ignoring excessive connection\n"); close(fd); } else { if (!create_client(fd)) sockwrite(fd, ERROR, "Internal error"); else sockwrite(fd, OK, "%d %d %d", game_type, (int)(shot_speed / SPEED_RATIO), max_cycles); if (autostart_robots > 0 && max_robots == autostart_robots) res = 1; } } if (event == EVENT_START) res = 1; if (res) { ndprintf(stdout, "[GAME] Starting. All clients connected!\n"); /* notify all robots that are passively waiting for game start */ for (i = 0; i < max_robots; i++) { if (!all_robots[i]->waiting) continue; all_robots[i]->waiting = 0; sockwrite(fds[i].fd, OK, "1"); } gettimeofday(&game_start, NULL); current_passive_cycles = 0; } return res; }
void server_start (char *hostname, char *port) { int sockd, ret, fd, i, opt = 1; struct addrinfo *ai, *runp, hints; struct sockaddr *addr; socklen_t addrlen = sizeof(addr); double start, end; memset (&hints, 0x0, sizeof (hints)); hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; hints.ai_socktype = SOCK_STREAM; ndprintf(stdout, "[SERVER] Starting Server at %s:%s\n[INFO] Number of players: %d\n", hostname, port, max_robots); if ((ret = getaddrinfo(hostname, port, &hints, &ai))) ndprintf_die(stderr, "[ERROR] getaddrinfo('%s', '%s'): %s\n", hostname, port, gai_strerror(ret)); if (!ai) ndprintf_die(stderr, "[ERROR] getaddrinf(): couldn't fill the struct!\n"); runp = ai; do { sockd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol); if (sockd != -1) break; runp = runp->ai_next; } while (runp); if (sockd == -1) ndprintf_die(stderr, "[ERROR] socket(): Couldn't create socket!\n"); /* To close the port after closing the socket */ if (setsockopt(sockd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) == -1) ndprintf_die(stderr, "[ERROR] setsockopt(): %s\n", strerror(errno)); if (bind(sockd, runp->ai_addr, runp->ai_addrlen)) ndprintf_die(stderr, "[ERROR] bind(): %s\n", strerror(errno)); if (listen(sockd, max_robots)) ndprintf_die(stderr, "[ERROR] listen(): %s\n", strerror(errno)); if (!(fds = (struct pollfd *) malloc (max_robots * sizeof(struct pollfd)))) ndprintf_die(stderr, "[ERROR] Coulnd't malloc space for fds!\n"); while (1) { /* Wait for all the clients to connect */ fd = accept(sockd, (struct sockaddr *) &addr, &addrlen); if (!create_client(fd)) sockwrite(fd, ERROR, "Couldn't duplicate the FD\n"); if (current_robots >= max_robots) break; } ndprintf(stdout, "[GAME] Starting. All clients connected!\n"); for (i = 0; i < max_robots; i++) sockwrite(fds[i].fd, START, "Let's play!"); signal (SIGALRM, raise_timer); }
void server_start(char *hostname, char *port) { int ret, opt = 1; struct addrinfo *ai, *runp, hints; memset(&hints, 0x0, sizeof (hints)); hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; hints.ai_socktype = SOCK_STREAM; ndprintf(stdout, "[SERVER] Starting Server at %s:%s\n", hostname, port); if (autostart_robots > 0) ndprintf(stdout, "[INFO] Number of players: %d\n", autostart_robots); if ((ret = getaddrinfo(hostname, port, &hints, &ai))) ndprintf_die(stderr, "[ERROR] getaddrinfo('%s', '%s'): %s\n", hostname, port, gai_strerror(ret)); if (!ai) ndprintf_die(stderr, "[ERROR] getaddrinf(): couldn't fill the struct!\n"); runp = ai; do { sockd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol); if (sockd != -1) break; runp = runp->ai_next; } while (runp); if (sockd == -1) ndprintf_die(stderr, "[ERROR] socket(): Couldn't create socket!\n"); /* To close the port after closing the socket */ if (setsockopt(sockd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) == -1) ndprintf_die(stderr, "[ERROR] setsockopt(): %s\n", strerror(errno)); if (fcntl(sockd, F_SETFL, O_NONBLOCK)) ndprintf_die(stderr, "[ERROR] fcntl(): %s\n", strerror(errno)); if (bind(sockd, runp->ai_addr, runp->ai_addrlen)) ndprintf_die(stderr, "[ERROR] bind(): %s\n", strerror(errno)); if (listen(sockd, MAX_ROBOTS)) ndprintf_die(stderr, "[ERROR] listen(): %s\n", strerror(errno)); if (!(fds = (struct pollfd *) malloc (MAX_ROBOTS * sizeof(struct pollfd)))) ndprintf_die(stderr, "[ERROR] Coulnd't malloc space for fds!\n"); }