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