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; +}