From 6eb2e2d9274c4350324200e9bd6a92906c0fd2d0 Mon Sep 17 00:00:00 2001 From: 20050114 <20050114@studenti.uniupo.it> Date: Fri, 17 May 2024 09:59:37 +0200 Subject: [PATCH] fix --- .../Assigment4/EchoServer/client.c | 75 +++++++++++ .../Assigment4/EchoServer/makefile | 10 ++ .../Assigment4/EchoServer/server.c | 125 ++++++++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 Reti/Laboratorio/Assigment4/EchoServer/client.c create mode 100644 Reti/Laboratorio/Assigment4/EchoServer/makefile create mode 100644 Reti/Laboratorio/Assigment4/EchoServer/server.c diff --git a/Reti/Laboratorio/Assigment4/EchoServer/client.c b/Reti/Laboratorio/Assigment4/EchoServer/client.c new file mode 100644 index 0000000..c62a176 --- /dev/null +++ b/Reti/Laboratorio/Assigment4/EchoServer/client.c @@ -0,0 +1,75 @@ +#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'}; + printf("-1 per uscire\n"); + while (valueToSend[0] != '-' && valueToSend[1] != '1') { + + 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); + } + + /* 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); + memset(valueToReceive, 0, sizeof(valueToReceive)); + memset(valueToSend, 0, sizeof(valueToSend)); + } + + return 0; +} diff --git a/Reti/Laboratorio/Assigment4/EchoServer/makefile b/Reti/Laboratorio/Assigment4/EchoServer/makefile new file mode 100644 index 0000000..f0ddf27 --- /dev/null +++ b/Reti/Laboratorio/Assigment4/EchoServer/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/EchoServer/server.c b/Reti/Laboratorio/Assigment4/EchoServer/server.c new file mode 100644 index 0000000..bb20060 --- /dev/null +++ b/Reti/Laboratorio/Assigment4/EchoServer/server.c @@ -0,0 +1,125 @@ +#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[]) +{ + + time_t ticks = time(NULL); + char MESSAGE[28] = {'\0'}; + snprintf(MESSAGE, sizeof(MESSAGE), "%.24s\r\n", ctime(&ticks)); + + 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); + } + + while (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); + } + + /* handle the new connection request */ + /* write out our message to the client */ + + // Read message from client + char bufferRead[256] = {'\0'}; + printf("%zu\n\n", 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