diff --git a/3 b/3 deleted file mode 100644 index 681b908..0000000 --- a/3 +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -char recv_buf[3000]; -char send_buf[3000]; - -int maxfd; -int lastid = 0; -int sockfd; - -int main(int ac, char **av) { - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - - while (1) { - } -} diff --git a/a.out b/a.out new file mode 100755 index 0000000..ad79be9 Binary files /dev/null and b/a.out differ diff --git a/flake.nix b/flake.nix index 4b2a145..8695905 100644 --- a/flake.nix +++ b/flake.nix @@ -34,6 +34,10 @@ ]; packages = with pkgs; [ nixfmt-rfc-style + glibcInfo + man + man-pages + man-pages-posix valgrind gdb ]; diff --git a/mini_serv.c b/mini_serv.c index 1a09525..b91d3c6 100644 --- a/mini_serv.c +++ b/mini_serv.c @@ -22,6 +22,21 @@ int sockfd; fd_set main_fd, read_fd; +void append_client(int cli_fd) { + lastid++; + clients[cli_fd].id = lastid; + clients[cli_fd].msg = NULL; + FD_SET(cli_fd, &main_fd); +} + +void send_all() { + size_t len = strlen(send_buf); + + for (int i = 0; i <= maxfd; i++) + if (FD_ISSET(i, &read_fd)) + send(i, send_buf, len, 0); +} + int send_error(void) { for (int i = 0; i < FD_SETSIZE; i++) if (FD_ISSET(i, &main_fd)) @@ -37,17 +52,16 @@ int main(int ac, char **av) { return (EXIT_FAILURE); } - int len; + socklen_t len; struct sockaddr_in servaddr, cli; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) return (send_error()); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 - servaddr.sin_port = htons(atoi(av[1])); - + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(2130706433); // 127.0.0.1 + servaddr.sin_port = htons(atoi(av[1])); if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) return (send_error()); @@ -56,6 +70,7 @@ int main(int ac, char **av) { return (send_error()); FD_ZERO(&main_fd); + FD_ZERO(&read_fd); FD_SET(sockfd, &main_fd); maxfd = sockfd; @@ -68,9 +83,19 @@ int main(int ac, char **av) { for (int i = 0; i <= maxfd; i++) { if (FD_ISSET(i, &read_fd)) { if (i == sockfd) { + len = sizeof(cli); + int cli_fd = accept(i, (struct sockaddr *)&cli, &len); + if (cli_fd < 0) + return (send_error()); + if (cli_fd > maxfd) + maxfd = cli_fd; + append_client(cli_fd); + bzero(send_buf, 3000); + sprintf(send_buf, "server: client %d just arrived\n", + lastid); + send_all(); } else { - } } }