From 319dac142cfef7e9ac6bb00f1db2ffe488ddd1f9 Mon Sep 17 00:00:00 2001 From: 20050114 <20050114@studenti.uniupo.it> Date: Fri, 17 May 2024 09:59:14 +0200 Subject: [PATCH] fix --- .../Assigment4/EchoServer2/client.c | 92 ++++++++++++++ .../Assigment4/EchoServer2/makefile | 10 ++ .../Assigment4/EchoServer2/server.c | 119 ++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 Reti/Laboratorio/Assigment4/EchoServer2/client.c create mode 100644 Reti/Laboratorio/Assigment4/EchoServer2/makefile create mode 100644 Reti/Laboratorio/Assigment4/EchoServer2/server.c diff --git a/Reti/Laboratorio/Assigment4/EchoServer2/client.c b/Reti/Laboratorio/Assigment4/EchoServer2/client.c new file mode 100644 index 0000000..98b1655 --- /dev/null +++ b/Reti/Laboratorio/Assigment4/EchoServer2/client.c @@ -0,0 +1,92 @@ +#include <arpa/inet.h> +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> + +int main(int argc, char *argv[]) +{ + char valueToSend[256] = {'\0'}; + char valueToReceive[256] = {'\0'}; + char iterationsServer[256] = {'\0'}; + + int iterations; + printf("Inserire il numero di iterazioni: "); + scanf("%d", &iterations); + snprintf(iterationsServer, sizeof(iterationsServer), "%d", iterations); + + int simpleSocket = 0; + int simplePort = 0; + int returnStatus = 0; + char buffer[256] = ""; + struct sockaddr_in simpleServer; + + if (argc != 3) + { + fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]); + exit(1); + } + + /* create a streaming socket */ + simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (simpleSocket == -1) + { + fprintf(stderr, "Could not create a socket!\n"); + exit(1); + } + else + { + fprintf(stderr, "Socket created!\n"); + } + + /* retrieve the port number for connecting */ + simplePort = atoi(argv[2]); + + /* setup the address structure */ + /* use the IP address sent as an argument for the server address */ + // bzero(&simpleServer, sizeof(simpleServer)); + memset(&simpleServer, '\0', sizeof(simpleServer)); + simpleServer.sin_family = AF_INET; + // inet_addr(argv[2], &simpleServer.sin_addr.s_addr); + simpleServer.sin_addr.s_addr = inet_addr(argv[1]); + simpleServer.sin_port = htons(simplePort); + + /* connect to the address and port with our socket */ + returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer, + sizeof(simpleServer)); + + if (returnStatus == 0) + { + fprintf(stderr, "Connect successful!\n"); + } + else + { + fprintf(stderr, "Could not connect to address!\n"); + close(simpleSocket); + exit(1); + } + + // Inviando il numero di iterazioni al server + write(simpleSocket, iterationsServer, strlen(valueToSend)); + + for (int i = 0; i < iterations; ++i) + { + + /* get the message from the server */ + // returnStatus = read(simpleSocket, buffer, sizeof(buffer)); + + printf("Inserire il valore da voler inviare al server: "); + scanf("%s", valueToSend); + write(simpleSocket, valueToSend, strlen(valueToSend)); + read(simpleSocket, valueToReceive, sizeof(valueToReceive)); + printf("\n\nEcho: %s\n", valueToReceive); + close(simpleSocket); + } + + close(simpleSocket); + return 0; +} diff --git a/Reti/Laboratorio/Assigment4/EchoServer2/makefile b/Reti/Laboratorio/Assigment4/EchoServer2/makefile new file mode 100644 index 0000000..f0ddf27 --- /dev/null +++ b/Reti/Laboratorio/Assigment4/EchoServer2/makefile @@ -0,0 +1,10 @@ +all: client server + +client: client.c + gcc client.c -o client + +server: server.c + gcc server.c -o server + +clean: + rm -f client server diff --git a/Reti/Laboratorio/Assigment4/EchoServer2/server.c b/Reti/Laboratorio/Assigment4/EchoServer2/server.c new file mode 100644 index 0000000..1da1658 --- /dev/null +++ b/Reti/Laboratorio/Assigment4/EchoServer2/server.c @@ -0,0 +1,119 @@ +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <time.h> +#include <unistd.h> + +// const char MESSAGE[] = "Guess who's back!\n"; + +int main(int argc, char *argv[]) +{ + int simpleSocket = 0; + int simplePort = 0; + int returnStatus = 0; + struct sockaddr_in simpleServer; + + if (argc < 1 || argc > 2) + { + fprintf(stderr, "Usage: %s <port>\n", argv[0]); + exit(1); + } + + simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (simpleSocket == -1) + { + + fprintf(stderr, "Could not create a socket!\n"); + exit(1); + } + else + { + fprintf(stderr, "Socket created!\n"); + } + + /* retrieve the port number for listening */ + if (argc == 2) + { + simplePort = atoi(argv[1]); + if (simplePort < 10000 || simplePort > 12000) + { + fprintf(stderr, "Port must be in range [10000, 12000]\n"); + exit(1); + } + } + else + { + srand(time(NULL)); + simplePort = (rand() % 1999) + 10000; + } + + /* setup the address structure */ + /* use INADDR_ANY to bind to all local addresses */ + memset(&simpleServer, '\0', sizeof(simpleServer)); + simpleServer.sin_family = AF_INET; + simpleServer.sin_addr.s_addr = htonl(INADDR_ANY); + simpleServer.sin_port = htons(simplePort); + + /* bind to the address and port with our socket */ + returnStatus = bind(simpleSocket, (struct sockaddr *)&simpleServer, + sizeof(simpleServer)); + + if (returnStatus == 0) + { + fprintf(stderr, "Bind completed on port %d!\n", simplePort); + } + else + { + fprintf(stderr, "Could not bind to address!\n"); + close(simpleSocket); + exit(1); + } + + /* lets listen on the socket for connections */ + returnStatus = listen(simpleSocket, 5); + + if (returnStatus == -1) + { + fprintf(stderr, "Cannot listen on socket!\n"); + close(simpleSocket); + exit(1); + } + + struct sockaddr_in clientName = {0}; + int simpleChildSocket = 0; + int clientNameLength = sizeof(clientName); + + /* wait here */ + + simpleChildSocket = + accept(simpleSocket, (struct sockaddr *)&clientName, &clientNameLength); + + if (simpleChildSocket == -1) + { + fprintf(stderr, "Cannot accept connections!\n"); + close(simpleSocket); + exit(1); + } + + char bufferRead[256] = {'\0'}; + read(simpleChildSocket, bufferRead, sizeof(bufferRead)); + + while (1) + { + // Read message from client + read(simpleChildSocket, bufferRead, sizeof(bufferRead)); + printf("Received: %s\n", bufferRead); + char valueToSend[256] = {'\0'}; + snprintf(valueToSend, sizeof(valueToSend), "%s", bufferRead); + write(simpleChildSocket, valueToSend, sizeof(valueToSend)); + + close(simpleChildSocket); + } + + close(simpleSocket); + return 0; +} -- GitLab