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);
broadcast(msg, &fdset, max_fd, server_fd, client_fd);
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) {

View File

@@ -108,6 +108,13 @@ int main(int ac, char **av) {
sprintf(msg, "server: client %d just left\n", clients[client_fd].id);
broadcast(msg, &fdset, max_fd, server_fd, client_fd);
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) {

View File

@@ -1,128 +1,51 @@
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 160000
#define MSGSIZE 1024
#define MSGSIZE 160000
typedef struct s_client {
int id;
char msg[MSGSIZE];
} t_client;
int main() {
int sockfd, connfd, len;
struct sockaddr_in servaddr, cli;
void error(char *msg) {
write(1, msg, strlen(msg));
exit(1);
}
void broadcast(fd_set *set, int max_fd, char *msg, int server_fd, int current_fd) {
for(int i = 0; i < max_fd; ++i) {
if (i == server_fd)
continue;
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");
// socket create and verification
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");
bzero(&servaddr, sizeof(servaddr));
// assign IP, PORT
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1
addr.sin_port = htons(port);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1
servaddr.sin_port = htons(8081);
// 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;
id = 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++;
}
if ((bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr))) != 0) {
printf("socket bind failed...\n");
exit(0);
}
else
printf("Socket successfully binded..\n");
if (listen(sockfd, 10) != 0) {
printf("cannot listen\n");
exit(0);
}
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
port=0
while [ $port -lt 1024 -o $port -gt 10000 ]; do
port=$RANDOM
done
echo "Running tests on port $port..."
port=8081
clang -Wall -Wextra -Werror mini_serv.c -o mini_serv
./mini_serv "$port" &
nc localhost "$port" &
for i in {1..30}
for i in {1..3000}
do
nc localhost "$port" &
kill -KILL $(pidof nc | tr ' ' '\n' | head -n1)