diff --git a/Reti/Laboratorio/Assigment6/EchoServerUDP/client b/Reti/Laboratorio/Assigment6/EchoServerUDP/client
new file mode 100755
index 0000000000000000000000000000000000000000..0492ed069be87dd7d80a50fcad255411fc94e3c5
Binary files /dev/null and b/Reti/Laboratorio/Assigment6/EchoServerUDP/client differ
diff --git a/Reti/Laboratorio/Assigment6/EchoServerUDP/client.c b/Reti/Laboratorio/Assigment6/EchoServerUDP/client.c
new file mode 100644
index 0000000000000000000000000000000000000000..2a0d7e2ce6535cc8a59f8ce241c61596692fe7ce
--- /dev/null
+++ b/Reti/Laboratorio/Assigment6/EchoServerUDP/client.c
@@ -0,0 +1,61 @@
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#define MAXSIZEBUFFER 256
+
+int main(int argc, char *argv[]) {
+  int simpleSocket = 0;
+  int simplePort = 0;
+  int returnStatus = 0;
+  struct sockaddr_in serverAddr, clientAddr;
+  socklen_t serverSize, clientSize;
+
+  char buffer[MAXSIZEBUFFER] = {'\0'};
+
+  if (argc != 3) {
+    fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]);
+    exit(1);
+  }
+
+  simplePort = atoi(argv[2]);
+
+  simpleSocket = socket(AF_INET, SOCK_DGRAM, 0);
+
+  if (simpleSocket == -1) {
+    fprintf(stderr, "Could not create a socket!\n");
+    exit(1);
+  } else {
+    printf("Socket created!\n");
+  }
+
+  memset(&clientAddr, '\0', sizeof(clientAddr));
+  clientAddr.sin_family = AF_INET;
+  clientAddr.sin_addr.s_addr = inet_addr(argv[1]);
+  clientAddr.sin_port = htons(simplePort);
+
+  clientSize = sizeof(clientAddr);
+
+  printf("Inserisci un valore: ");
+  scanf("%s", buffer);
+
+  sendto(simpleSocket, buffer, strlen(buffer), 0,
+         (struct sockaddr *)&clientAddr, clientSize);
+
+  // Waiting for Echo
+
+  memset(buffer, '\0', sizeof(buffer));
+
+  recvfrom(simpleSocket, buffer, MAXSIZEBUFFER, 0,
+           (struct sockaddr *)&serverAddr, &serverSize);
+
+  printf("Echo from server: %s\n", buffer);
+
+  return 0;
+}
diff --git a/Reti/Laboratorio/Assigment6/EchoServerUDP/makefile b/Reti/Laboratorio/Assigment6/EchoServerUDP/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..f0ddf2785d27023f6a46168567b61136c6fc91b9
--- /dev/null
+++ b/Reti/Laboratorio/Assigment6/EchoServerUDP/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/Assigment6/EchoServerUDP/server b/Reti/Laboratorio/Assigment6/EchoServerUDP/server
new file mode 100755
index 0000000000000000000000000000000000000000..f7bb6edcc899947c9fa380ff6607099b128035bf
Binary files /dev/null and b/Reti/Laboratorio/Assigment6/EchoServerUDP/server differ
diff --git a/Reti/Laboratorio/Assigment6/EchoServerUDP/server.c b/Reti/Laboratorio/Assigment6/EchoServerUDP/server.c
new file mode 100644
index 0000000000000000000000000000000000000000..f2f26a4ed1e06832553b6cfff35b822d97c3f8b6
--- /dev/null
+++ b/Reti/Laboratorio/Assigment6/EchoServerUDP/server.c
@@ -0,0 +1,84 @@
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+
+#define MAXSIZEBUFFER 256
+
+int main(int argc, char *argv[]) {
+  int simpleSocket = 0;
+  int simplePort = 0;
+  int returnStatus = 0;
+  struct sockaddr_in clientAddr, serverAddr;
+  socklen_t clientSize, serverSize;
+
+  char buffer[MAXSIZEBUFFER] = {'\0'};
+
+  if (argc < 1 || argc > 2) {
+    fprintf(stderr, "Usage: %s <port>\n", argv[0]);
+    exit(1);
+  }
+
+  // Creating UDP Socket
+  simpleSocket = socket(AF_INET, SOCK_DGRAM, 0);
+
+  if (simpleSocket == -1) {
+    fprintf(stderr, "Could not create a socket!\n");
+    exit(1);
+  } else {
+    printf("Socket created!\n");
+  }
+
+  // if available use argv[1] for port number, else generate a randome one
+  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;
+    // simplePort = 11100;
+  }
+
+  // Setup the address structure of the destination
+  // use INADDR_ANY to bind to all local addresses
+  serverSize = sizeof(serverAddr);
+  memset(&serverAddr, '\0', serverSize);
+  serverAddr.sin_family = AF_INET;
+  serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+  serverAddr.sin_port = htons(simplePort);
+
+  returnStatus = bind(simpleSocket, (struct sockaddr *)&serverAddr, serverSize);
+
+  if (returnStatus != 0) {
+    fprintf(stderr, "Error, Impossible to Bind Socket\n");
+    exit(1);
+  } else {
+    printf("Bind Complete on %d!\n", simplePort);
+  }
+
+  while (1) {
+    // Recive from client
+    memset(buffer, '\0', sizeof(buffer));
+
+    recvfrom(simpleSocket, buffer, MAXSIZEBUFFER, 0,
+             (struct sockaddr *)&clientAddr, &clientSize);
+
+    printf("Received: '%s' | Sender IP: '%s'\n", buffer,
+           inet_ntoa(clientAddr.sin_addr));
+
+    // Send to client
+    sendto(simpleSocket, buffer, strlen(buffer), 0,
+           (struct sockaddr *)&clientAddr, clientSize);
+  }
+
+  return 0;
+}