mini tester ok

This commit is contained in:
asus
2023-02-17 13:11:27 +01:00
parent b401ebb5ab
commit 356267e288
8 changed files with 11991 additions and 121 deletions

BIN
a.out

Binary file not shown.

5941
log.txt

File diff suppressed because it is too large Load Diff

6000
log1.txt Normal file

File diff suppressed because it is too large Load Diff

BIN
mini_serv

Binary file not shown.

View File

@@ -108,6 +108,13 @@ int main(int ac, char **av) {
sprintf(msg, "server: client %d just left\n", clients[client_fd].id); sprintf(msg, "server: client %d just left\n", clients[client_fd].id);
broadcast(msg, &fdset, max_fd, server_fd, client_fd); broadcast(msg, &fdset, max_fd, server_fd, client_fd);
FD_CLR(client_fd, &fdset); FD_CLR(client_fd, &fdset);
close(client_fd);
if (client_fd == max_fd) {
for(; max_fd > 2; --max_fd) {
if (FD_ISSET(max_fd, &fdset))
break;
}
}
} }
else if (ret > 0) { else if (ret > 0) {

View File

@@ -108,6 +108,13 @@ int main(int ac, char **av) {
sprintf(msg, "server: client %d just left\n", clients[client_fd].id); sprintf(msg, "server: client %d just left\n", clients[client_fd].id);
broadcast(msg, &fdset, max_fd, server_fd, client_fd); broadcast(msg, &fdset, max_fd, server_fd, client_fd);
FD_CLR(client_fd, &fdset); FD_CLR(client_fd, &fdset);
close(client_fd);
if (client_fd == max_fd) {
for(; max_fd > 2; --max_fd) {
if (FD_ISSET(max_fd, &fdset))
break;
}
}
} }
else if (ret > 0) { else if (ret > 0) {

View File

@@ -1,128 +1,51 @@
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 160000 #define BUFSIZE 160000
#define MSGSIZE 1024 #define MSGSIZE 160000
typedef struct s_client { int main() {
int id; int sockfd, connfd, len;
char msg[MSGSIZE]; struct sockaddr_in servaddr, cli;
} t_client;
void error(char *msg) { // socket create and verification
write(1, msg, strlen(msg)); sockfd = socket(AF_INET, SOCK_STREAM, 0);
exit(1); if (sockfd == -1) {
} printf("socket creation failed...\n");
exit(0);
void broadcast(fd_set *set, int max_fd, char *msg, int server_fd, int current_fd) { }
for(int i = 0; i < max_fd; ++i) { else
if (i == server_fd) printf("Socket successfully created..\n");
continue; bzero(&servaddr, sizeof(servaddr));
if (i == current_fd)
continue;
if (FD_ISSET(i, set))
send(i, msg, strlen(msg), 0);
}
}
int main(int ac, char **av) {
int server_fd;
int client_fd;
int id;
int port;
int max_fd;
int ret;
struct sockaddr_in addr;
socklen_t addr_len;
fd_set fdset;
fd_set rdset;
t_client clients[FD_SETSIZE];
t_client client;
char buf[BUFSIZE];
char msg[BUFSIZE];
if (ac != 2)
error("Wrong number of arguments\n");
if ( (port = atoi(av[1])) == -1)
error("Fatal error\n");
addr_len = sizeof(addr);
// socket create and verification
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1)
error("Fatal error\n");
// assign IP, PORT // assign IP, PORT
addr.sin_family = AF_INET; servaddr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 servaddr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1
addr.sin_port = htons(port); servaddr.sin_port = htons(8081);
// Binding newly created socket to given IP and verification // Binding newly created socket to given IP and verification
if ((bind(server_fd, (const struct sockaddr *)&addr, addr_len)) == -1) if ((bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr))) != 0) {
error("Fatal error\n"); printf("socket bind failed...\n");
if (listen(server_fd, 10) == -1) exit(0);
error("Fatal error\n"); }
else
FD_ZERO(&fdset); printf("Socket successfully binded..\n");
FD_SET(server_fd, &fdset); if (listen(sockfd, 10) != 0) {
max_fd = server_fd; printf("cannot listen\n");
id = 0; exit(0);
bzero(&clients, sizeof(clients));
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);
if (client_fd > max_fd)
max_fd = client_fd;
client = clients[client_fd];
client.id = id;
bzero(client.msg, MSGSIZE);
sprintf(msg, "server: client %d arrived\n", client.id);
broadcast(&fdset, max_fd, msg, server_fd, client_fd);
id++;
}
client_fd = 0;
while(client_fd <= max_fd) {
ret = 1;
if (FD_ISSET(client_fd, &rdset)) {
client = clients[client_fd];
bzero(buf, BUFSIZE);
ret = recv(client_fd, buf, BUFSIZE, 0);
if (ret == 0) {
sprintf(msg, "server: client %d left\n", client.id);
broadcast(&fdset, max_fd, msg, server_fd, client_fd);
FD_CLR(client_fd, &fdset);
}
else if (ret > 0) {
for(int i = 0, j = strlen(client.msg); i < ret; ++i, ++j) {
client.msg[j] = buf[i];
if (buf[i] == '\n') {
client.msg[j] = '\0';
sprintf(msg, "client %d: %s\n", client.id, client.msg);
broadcast(&fdset, max_fd, msg, server_fd, client_fd);
bzero(client.msg, MSGSIZE);
j = -1;
}
}
}
}
client_fd++;
}
} }
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");
} }

View File

@@ -1,17 +1,11 @@
#!/bin/bash #!/bin/bash
port=0 port=8081
while [ $port -lt 1024 -o $port -gt 10000 ]; do
port=$RANDOM
done
echo "Running tests on port $port..."
clang -Wall -Wextra -Werror mini_serv.c -o mini_serv clang -Wall -Wextra -Werror mini_serv.c -o mini_serv
./mini_serv "$port" & ./mini_serv "$port" &
nc localhost "$port" & nc localhost "$port" &
for i in {1..30} for i in {1..3000}
do do
nc localhost "$port" & nc localhost "$port" &
kill -KILL $(pidof nc | tr ' ' '\n' | head -n1) kill -KILL $(pidof nc | tr ' ' '\n' | head -n1)