diff --git a/a.out b/a.out index 3589a8e..567c8b6 100755 Binary files a/a.out and b/a.out differ diff --git a/mini_serv_ex.c b/mini_serv_2.c similarity index 100% rename from mini_serv_ex.c rename to mini_serv_2.c diff --git a/mini_serv_3.c b/mini_serv_3.c new file mode 100644 index 0000000..bbf2692 --- /dev/null +++ b/mini_serv_3.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include + +#define BUFSIZE 42000 + +void error(char *msg) { + write(2, msg, strlen(msg)); + exit (1); +} + +void broadcast(char *buf, fd_set *set, int max_fd, int server_fd, int sender_fd) { + for(int i = 0; i <= max_fd; i++) { + if (i == server_fd) + continue; + if (i == sender_fd) + continue; + if (FD_ISSET(i, set)) + send(i, buf, strlen(buf), 0); + } +} + +int main(int ac, char **av) { + int server_fd; + int client_fd; + int client_id; + int port; + int max_fd; + int ret; + struct sockaddr_in addr; + socklen_t addr_len; + fd_set fdset; + fd_set rdset; + char buf[BUFSIZE]; + char tmp_buf[BUFSIZE]; + int clients[FD_SETSIZE]; + + if (ac != 2) + error("Fatal error\n"); + port = atoi(av[1]); + addr_len = sizeof(addr); + + // socket create and verification + server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd == -1) + error("Fatal error\n"); + bzero(&addr, addr_len); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 + addr.sin_port = htons(port); + if ((bind(server_fd, (const struct sockaddr *)&addr, addr_len)) == -1) + error("Fatal error\n"); + if (listen(server_fd, 10) == -1) + error("Fatal error\n"); + + FD_ZERO(&fdset); + FD_SET(server_fd, &fdset); + max_fd = server_fd; + client_id = 0; + + while(1) { + rdset = fdset; + + select(max_fd + 1, &rdset, NULL, NULL, NULL); + + if (FD_ISSET(server_fd, &rdset)) { + client_fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len); + FD_SET(client_fd, &fdset); + clients[client_fd] = client_id; + if (client_fd > max_fd) + max_fd = client_fd; + sprintf(buf, "server: client %d just arrived\n", client_id); + broadcast(buf, &fdset, max_fd, server_fd, client_fd); + client_id++; + } + + client_fd = 0; + while(client_fd <= max_fd) { + if (FD_ISSET(client_fd, &rdset)) { + bzero(buf, BUFSIZE); + ret = recv(client_fd, buf, BUFSIZE, 0); + if (ret == 0) { + sprintf(buf, "server: client %d just left\n", clients[client_fd]); + broadcast(buf, &fdset, max_fd, server_fd, client_fd); + FD_CLR(client_fd, &fdset); + } + else if (ret > 0) { + sprintf(tmp_buf, "client %d: %s", clients[client_fd], buf); + broadcast(tmp_buf, &fdset, max_fd, server_fd, client_fd); + } + } + client_fd++; + } + } + + return (0); +} +