#include #include #include #include #include #include struct client { char nickname[32]; int has_nickname; }; int prompt_nickname(int fd) { char *message = "Enter your nickname:\n"; write(fd, message, strlen(message)); return 0; } int set_nickname(struct client *c, const char *input, ssize_t n); // returns a socket file descriptor. // if connection could not be established, -1 gets returned int establish_connection(struct sockaddr_in addr) { int sfd = socket(AF_INET, SOCK_STREAM, 0); if (sfd == -1) { return -1; } int opt = -1; setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); int bind_addr = bind(sfd, (struct sockaddr *)&addr, sizeof(addr)); if (bind_addr == -1) { close(sfd); return -1; } int listen_addr = listen(sfd, 100); if (listen_addr == -1) { close(sfd); return -1; } return sfd; } // handles new telnet connections. // returns 0 on success and -1 on failure. int handle_new_connection(int sfd, struct pollfd *fds, nfds_t *nfds, struct client *clients) { int conn = accept(sfd, NULL, NULL); if (conn == -1) return -1; fds[*nfds].fd = conn; fds[*nfds].events = POLLIN; clients[*nfds].has_nickname = 0; prompt_nickname(fds[*nfds].fd); (*nfds)++; return 0; } // process message to all the connected clients. // returns 0 on success and -1 on failure. // TODO: add struct client *clients int process_message(struct pollfd *fds, nfds_t *nfds, struct client *clients) { for (nfds_t i = 1; i < *nfds; i++) { /* if client has something to say */ if (fds[i].revents & POLLIN) { char buffer[1024]; /* create a new empty buffer */ ssize_t message = read(fds[i].fd, buffer, sizeof(buffer)); /* read the message which the client sent */ if (message == 0) { /* close the connection if client disappeared or disconnected */ close(fds[i].fd); fds[i] = fds[*nfds - 1]; /* move back last slot */ (*nfds)--; /* size down the current array */ i--; } else if (message == -1) { /* if message of the client returns an error */ close(fds[i].fd); fds[i] = fds[*nfds - 1]; /* move back last slot */ (*nfds)--; /* size down the current array */ i--; return -1; } else { /* send every message bytes to the other clients */ for (nfds_t j = 1; j < *nfds; j++) { if (j != i) { write(fds[j].fd, buffer, message); } } } } } return 0; }