From af37abb0781b53885d317f8027a805252dab78a6 Mon Sep 17 00:00:00 2001 From: Andruetto-Lorenzo Date: Tue, 13 May 2025 13:28:21 +0200 Subject: [PATCH 1/2] consegna es 1 socket API e client TCP --- .../socket_API/andruetto_echo_client_tcp.c | 116 ++++++++++++++++++ .../socket_API/andruetto_es1_byte_order.c | 17 +++ 2 files changed, 133 insertions(+) create mode 100644 RETI/andruetto_lorenzo/socket_API/andruetto_echo_client_tcp.c create mode 100644 RETI/andruetto_lorenzo/socket_API/andruetto_es1_byte_order.c diff --git a/RETI/andruetto_lorenzo/socket_API/andruetto_echo_client_tcp.c b/RETI/andruetto_lorenzo/socket_API/andruetto_echo_client_tcp.c new file mode 100644 index 00000000..26d6c799 --- /dev/null +++ b/RETI/andruetto_lorenzo/socket_API/andruetto_echo_client_tcp.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include +#include +#include + +/* +man 7 ip +man 7 tcp + */ + +/* man perror */ + +#define BUFSIZE 1024 + +void error(char *msg) +{ + perror(msg); + exit(1); +} + +int socket_create() +{ + int socket_fd; + + if((socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ + error("Cannot create the socket"); + exit(1); + } + + return socket_fd; +} + +void socket_connect(int socket_fd, char *ip, unsigned short tcp_port) +{ + struct in_addr server_ip; /* indirizzo ip */ + struct sockaddr_in serveraddr; /* indirizzo e porta server */ + + /* converte l'indirizzo IP in dotted-notation in binario in network order */ + inet_aton(ip, &server_ip); + + /* inizializza la struttura che contiene le informazioni del socket */ + memset(&serveraddr, '0', sizeof(serveraddr)); + serveraddr.sin_family = AF_INET; /* socket IP */ + serveraddr.sin_addr = server_ip; + serveraddr.sin_port = htons(tcp_port); /* porta tcp in network order*/ + + if(connect(socket_fd, + (struct sockaddr *)&serveraddr, + sizeof(struct sockaddr)) == -1) { + perror("Errone nella connessione al server"); + exit(1); + } +} + +int socket_receive(int socket_fd, char *buf) +{ + int msg_size; + + bzero(buf, BUFSIZE); + if((msg_size = read(socket_fd, buf, BUFSIZE)) < 0) + error("Errore nella ricezione dati"); + + return msg_size; +} + +int socket_send(int socket_fd, char *buf) +{ + int byte_sent; + + if((byte_sent = write(socket_fd, buf, strlen(buf))) < 0) + error("Errore nell'invio dati"); + + return byte_sent; +} + +int main(int argc, char **argv) +{ + unsigned short tcp_port; /* porta tcp di destinazione */ + char *ip; /* indirizzo ip di destinazione */ + int socket_fd; /* connection socket */ + char buf[BUFSIZE]; + int byte_sent; /* numero byte inviati */ + int msg_size; + + + /* Verifico la presenza dei parametre IP e porta */ + if(argc != 4) { + printf("uso: %s \n", argv[0]); + exit(1); + } + + /* Acquisisco IP e numero di porta */ + ip = argv[1]; + tcp_port = (unsigned short)atoi(argv[2]); + + /* Creo il socket */ + socket_fd = socket_create(); + + // Inizia la connessione al socket remoto + socket_connect(socket_fd, ip, tcp_port); + printf("Socket connesso con il server %s sulla porta %d\n", ip, tcp_port); + + /* invio sul socket la stringa */ + byte_sent = socket_send(socket_fd, argv[3]); + + msg_size = socket_receive(socket_fd, buf); + + printf("Inviato %d bytes con successo\n", byte_sent); + printf("Ha ricevuto %d byte e una stringa %s con successo\n", msg_size, buf); + + + close(socket_fd); +} diff --git a/RETI/andruetto_lorenzo/socket_API/andruetto_es1_byte_order.c b/RETI/andruetto_lorenzo/socket_API/andruetto_es1_byte_order.c new file mode 100644 index 00000000..d9afbd62 --- /dev/null +++ b/RETI/andruetto_lorenzo/socket_API/andruetto_es1_byte_order.c @@ -0,0 +1,17 @@ +#include +#include + +void main() { + printf("Primo array di numeri:\n"); + int numbers[] = {1000, 12890, 54163, 34012, 62984}; + + for(int i = 0; i < 5; i++) + printf("0x%x\n", htons(numbers[i])); + + int arr[] = {19875, 5499, 59821, 43120, 26489}; + + printf("\nSecondo array di numeri:\n"); + + for(int i = 0; i < 5; i++) + printf("0x%x\n", ntohs(arr[i])); +} \ No newline at end of file From 6867c0cde8045d7a444ab1768aeff885fa10745b Mon Sep 17 00:00:00 2001 From: Andruetto-Lorenzo Date: Tue, 13 May 2025 13:32:21 +0200 Subject: [PATCH 2/2] consegna server TCP --- .../socket_API/andruetto_echo_server_tcp.c | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 RETI/andruetto_lorenzo/socket_API/andruetto_echo_server_tcp.c diff --git a/RETI/andruetto_lorenzo/socket_API/andruetto_echo_server_tcp.c b/RETI/andruetto_lorenzo/socket_API/andruetto_echo_server_tcp.c new file mode 100644 index 00000000..a9f85119 --- /dev/null +++ b/RETI/andruetto_lorenzo/socket_API/andruetto_echo_server_tcp.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include +#include + +/* +man 7 ip +man 7 tcp + */ + +#define BUFSIZE 1024 +#define MAX_CONN 10 + +/* man perror */ +void error(char *msg) +{ + perror(msg); + exit(1); +} + +int socket_create() +{ + int socket_fd; + + if((socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ + error("Errore nella creazione del socket"); + exit(1); + } + return socket_fd; +} + +void socket_bind(int socket_fd, unsigned short tcp_port) +{ + struct sockaddr_in serveraddr; /* server address */ + + /* inizializza la struttura che contiene le informazioni del socket */ + memset(&serveraddr, '0', sizeof(serveraddr)); + serveraddr.sin_family = AF_INET; /* socket IP */ + serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* 0.0.0.0 */ + serveraddr.sin_port = htons(tcp_port); /* porta tcp in network order*/ + + /* bind del socket con indirizzo e porta */ + if(bind(socket_fd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) + error("Errore nella fase di binding"); +} + +void socket_listen(int socket_fd) +{ + if(listen(socket_fd, MAX_CONN) < 0) /* in ascolto sul socket max 10 connessioni*/ + error("Errore nella fase di listen"); +} + +int socket_accept(int socket_fd) +{ + int connection_fd; + struct sockaddr_in clientaddr; /* client address */ + socklen_t clientlen = sizeof(clientaddr); + + /* accetta una connessione TCP da un client */ + if((connection_fd = accept(socket_fd, + (struct sockaddr *) &clientaddr, + &clientlen)) < 0) + error("Errore nella fase di accept"); + return connection_fd; +} + +int socket_receive(int socket_fd, char *buf) +{ + int msg_size; + + bzero(buf, BUFSIZE); + if((msg_size = read(socket_fd, buf, BUFSIZE)) < 0) + error("Errore nella ricezione dati"); + + return msg_size; +} + + +int socket_send(int socket_fd, char *buf) +{ + int byte_sent; + + if((byte_sent = write(socket_fd, buf, strlen(buf))) < 0) + error("Errore nell'invio dati"); + + return byte_sent; +} +int main(int argc, char **argv) +{ + unsigned short tcp_port; /* TCP port in ascolto */ + int socket_fd; /* welcoming socket file descriptor */ + int connection_fd; /* connection socket file descriptor */ + char buf[BUFSIZE]; /* RX buffer */ + int msg_size; /* dimensione messaggio ricevuto */ + + /* Verifico la presenza del parametro porta e lo leggo*/ + if(argc != 2) { + printf("uso: %s \n", argv[0]); + exit(1); + } + tcp_port = (unsigned short)atoi(argv[1]); + + /* Creo il socket */ + socket_fd = socket_create(); + + /* bind del socket a IP e porta */ + socket_bind(socket_fd, tcp_port); + + /* metto il socket in ascolto */ + socket_listen(socket_fd); + + /* ciclo principale del server */ + printf("Server TCP pronto e in ascolto sulla porta %d\n\n", tcp_port); + for(;;) { + /* rimango in attesa fino a quando arriva una richiesta da un client */ + connection_fd = socket_accept(socket_fd); + + msg_size = socket_receive(connection_fd, buf); + printf("TCP server ha ricevuto %d byte: %s\n", msg_size, buf); + int byte_sent = socket_send(connection_fd, buf); + printf("Inviato %d bytes con successo, e la stringa ricevuta: %s\n", byte_sent, buf); + + /* chiudo la connessione con il client */ + close(connection_fd); + + } +}