From dfeb3c5e8f9ef845766e6589d9b9e5559876b1e7 Mon Sep 17 00:00:00 2001 From: hulamy Date: Fri, 10 Feb 2023 14:53:51 +0100 Subject: [PATCH] working --- a.out | Bin 16816 -> 16512 bytes mini_serv.c | 45 ++++-------- mini_serv_ex.c | 196 +++++++++++++++++++++++++++++++++---------------- 3 files changed, 147 insertions(+), 94 deletions(-) diff --git a/a.out b/a.out index 7605ae2f9fdd426e95d2a9112e20f13f3b15d7f1..548915322c14be641a218c55e88873ca1c6577ce 100755 GIT binary patch delta 2338 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 diff --git a/mini_serv.c b/mini_serv.c index c9aee6d..8f34032 100644 --- a/mini_serv.c +++ b/mini_serv.c @@ -31,7 +31,7 @@ // strstr // write -#define BUFSIZE 1024 +#define BUFSIZE 42000 void error(char *str) { write(2, str, strlen(str)); @@ -57,24 +57,13 @@ int init_socket(struct sockaddr_in *addr, int len, int port) { } void broadcast(char *buf, fd_set *set, int max_fd, int server_fd, int sender_fd) { - write(1, "---\n", 4); for(int i = 0; i <= max_fd; ++i) { - printf("[%d]\n", i); if (i == server_fd) - { - write(1, "is server\n", 10); continue; - } if (i == sender_fd) - { - write(1, "is sender\n", 10); continue; - } if (FD_ISSET(i, set)) - { send(i, buf, strlen(buf), 0); - write(1, buf, strlen(buf)); - } } } @@ -85,6 +74,7 @@ int main(int ac, char **av) { int max_fd; int client_id; char buf[BUFSIZE]; + char tmpbuf[BUFSIZE]; struct sockaddr_in addr; socklen_t addr_len; fd_set fdset; @@ -99,6 +89,7 @@ int main(int ac, char **av) { addr_len = sizeof(addr); server_fd = init_socket(&addr, addr_len, port); + FD_ZERO(&fdset); FD_SET(server_fd, &fdset); max_fd = server_fd; @@ -107,14 +98,12 @@ int main(int ac, char **av) { /* */ while (1) { -// FD_ZERO(&rdset); rdset = fdset; select(max_fd + 1, &rdset, NULL, NULL, NULL); // new connection - if (FD_ISSET(server_fd, &rdset)) - { + 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; @@ -129,25 +118,21 @@ int main(int ac, char **av) { client_fd = 0; while(client_fd <= max_fd) { ret = 1; - if (FD_ISSET(client_fd, &rdset)) + 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]); - write(1, buf, strlen(buf)); - broadcast(buf, &fdset, max_fd, server_fd, client_fd); - FD_CLR(client_fd, &fdset); - } - else { - sprintf(buf, "client %d: %s\n", clients[client_fd], buf); - write(1, buf, strlen(buf)); - broadcast(buf, &fdset, max_fd, server_fd, client_fd); + 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(tmpbuf, "client %d: %s", clients[client_fd], buf); + broadcast(tmpbuf, &fdset, max_fd, server_fd, client_fd); + } } client_fd++; } - - - // "client %d: " - // "server: client %d just left\n" } return (0); diff --git a/mini_serv_ex.c b/mini_serv_ex.c index a8563fc..afce175 100644 --- a/mini_serv_ex.c +++ b/mini_serv_ex.c @@ -1,79 +1,147 @@ -#include #include #include -#include -#include +#include #include -#include -#include +#include -typedef int bool; +// write +// close +// select +// socket +// accept +// listen +// send +// recv +// bind +// strstr +// malloc +// realloc +// free +// calloc +// bzero +// atoi +// sprintf +// strlen +// exit +// strcpy +// strcat +// memset -bool check_arguments(int argc) -{ - return (argc > 1); -} +#define BUFSIZE 42000 -void putstr_fd(char *str, int fd) -{ - write(fd, str, strlen(str)); -} - -void arguments_error(void) -{ - putstr_fd("Wrong number of arguments\n", 2); +void error(char *msg) { + write(2, msg, strlen(msg)); exit(1); } -void fatal_error(void) -{ - putstr_fd("Fatal error\n", 2); - exit(1); -} +int main(int ac, char **av) { + int server_fd; +// int client_fd; + int client_id; + int port; + int max_fd; +// char buf[BUFSIZE]; +// char tmp_buf[BUFSIZE]; +// int clients[FD_SETSIZE]; + struct sockaddr_in addr; + socklen_t addr_len; + fd_set fdset; + fd_set rdset; -int get_port(char *arg) -{ - int port = atoi(arg); - return (port); -} - -int main(int argc, char **argv) -{ - int port; - int server_fd; - int client_fd; - char buf[1024]; - struct sockaddr_in addr; - socklen_t addr_len; - fd_set fds; - - server_fd = socket(AF_INET, SOCK_STREAM, 0); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = htonl(INADDR_ANY); + if (ac != 2) + error("Wrong number of arguments\n"); + port = atoi(av[1]); addr_len = sizeof(addr); - if (!check_arguments(argc)) - arguments_error(); - if ((port = get_port(argv[1])) == -1) - fatal_error(); - printf("port = %d\n", port); - if (bind(server_fd, (struct sockaddr *)&addr, addr_len)== -1) - fatal_error(); - if (listen(server_fd, 0) == -1) - fatal_error(); - while (1) - { - if ((client_fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len)) == -1) - fatal_error(); - FD_ZERO(&fds); - FD_SET(client_fd, &fds); - select(client_fd + 1, &fds, NULL, NULL, NULL); - if (FD_ISSET(client_fd, &fds)) - { - recv(client_fd, buf, 1024, 0); - printf("Recv: %s\n", buf); - } + // socket create and verification + server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd == -1) + error("Fatal error\n"); + bzero(&addr, addr_len); + // assign IP, PORT + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 + addr.sin_port = htons(port); + // Binding newly created socket to given IP and verification + 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); + + // new connection + + + // new messages and close } + return (0); + +// len = sizeof(cli); +// connfd = accept(sockfd, (struct sockaddr *)&cli, &len); +// if (connfd < 0) { +// printf("server acccept failed...\n"); +// exit(0); +// } +// else +// printf("server acccept the client...\n"); } + + +//int extract_message(char **buf, char **msg) +//{ +// char *newbuf; +// int i; +// +// *msg = 0; +// if (*buf == 0) +// return (0); +// i = 0; +// while ((*buf)[i]) +// { +// if ((*buf)[i] == '\n') +// { +// newbuf = calloc(1, sizeof(*newbuf) * (strlen(*buf + i + 1) + 1)); +// if (newbuf == 0) +// return (-1); +// strcpy(newbuf, *buf + i + 1); +// *msg = *buf; +// (*msg)[i + 1] = 0; +// *buf = newbuf; +// return (1); +// } +// i++; +// } +// return (0); +//} +// +//char *str_join(char *buf, char *add) +//{ +// char *newbuf; +// int len; +// +// if (buf == 0) +// len = 0; +// else +// len = strlen(buf); +// newbuf = malloc(sizeof(*newbuf) * (len + strlen(add) + 1)); +// if (newbuf == 0) +// return (0); +// newbuf[0] = 0; +// if (buf != 0) +// strcat(newbuf, buf); +// free(buf); +// strcat(newbuf, add); +// return (newbuf); +//} + +