From 628985b5afed18eb7369e58a25664a924ad9ce6c Mon Sep 17 00:00:00 2001 From: Lacau Clement Date: Thu, 7 Mar 2024 11:04:17 +0100 Subject: [PATCH] (version 4): multiple connexion and correct infos display --- LACAU-Clement-Pseudos_codes.pdf | Bin 0 -> 70575 bytes tsock_v4.c | 353 ++++++++++++++++++++++++++++++++ 2 files changed, 353 insertions(+) create mode 100644 LACAU-Clement-Pseudos_codes.pdf create mode 100644 tsock_v4.c diff --git a/LACAU-Clement-Pseudos_codes.pdf b/LACAU-Clement-Pseudos_codes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f81a675353b41722817a64eba7ad79229c0c00a GIT binary patch literal 70575 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 VS9i*?7p%bKh|Cfasyb@S{|}qweL4UD literal 0 HcmV?d00001 diff --git a/tsock_v4.c b/tsock_v4.c new file mode 100644 index 0000000..5164038 --- /dev/null +++ b/tsock_v4.c @@ -0,0 +1,353 @@ +/* librairie standard ... */ +#include +/* pour getopt */ +#include +/* déclaration des types de base */ +#include +/* constantes relatives aux domaines, types et protocoles */ +#include +/* constantes et structures propres au domaine UNIX */ +#include +/* constantes et structures propres au domaine INTERNET */ +#include +/* structures retournées par les fonctions de gestion de la base de +données du réseau */ +#include +/* pour les entrées/sorties */ +#include +/* pour la gestion des erreurs */ +#include +#define QUEUE_SIZE 5 + +void construire_message(char* message, char motif, int lg, int numero_envoi); + +// Affichage distinct entre envoi et reception pour une facilité d'utilisation +void afficher_message_envoi(char *message, int lg, int numero_envoi); +void afficher_message_reception(char *message, int lg, int numero_envoi); + + +int main (int argc, char **argv) +{ + int c; + extern char *optarg; + extern int optind; + int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */ + int source = -1 ; /* 0=puits, 1=source */ + int udp=0; /* 0=TCP, 1=UDP */ + int lg=-1; /* Longueur des messages à envoyer ou recevoir: par défaut 30 octets */ + + while ((c = getopt(argc, argv, "pn:sul:")) != -1) { + switch (c) { + case 'p': + if (source == 1) { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1); + } + source = 0; + break; + + case 's': + if (source == 0) { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1) ; + } + source = 1; + break; + + case 'n': + nb_message = atoi(optarg); + // Packets are numerotated with 5 figures, which means the number of + // packets send can't be bigger than (or equal) 10 ** 6 + if(nb_message >= 100000) { + printf("Too many packets"); + exit(1); + } + + break; + + case 'u': + udp=1; + break; + + case 'l': + lg=atoi(optarg); + // A TCP packet is roughly 1500 bytes. We allow for some overhead. + // We provide an MTU of 1400 bytes. + // We also to send at least a message of 5 characters length for indice packet + if(lg >= 1400 || lg < 5) { + printf("Messages too long"); + exit(1); + } + break; + + default: + printf("usage: cmd [-p|-s][-n ##]\n"); + break; + } + } + + char* nom_machine_distante; + + // Recuperation du port + int port=atoi(argv[argc-1]); + //port = htons(port); + + // Default set of packet length : 30 bytes + if (lg == -1) { + lg=30; + } + + //Allocation du message, il est de la taille donnée en paramètre + char* message = malloc(lg * sizeof(char)); + + + if (source == -1) { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1) ; + } + + // If number of messages is not fixed for the source, it is set to 10 messages + if (nb_message == -1 && source ) { + nb_message = 10 ; + } + + + //Affichage des informations de communication initiée + if (source == 1) { + //Recuperation du nom logique + nom_machine_distante=argv[argc-2]; + printf("SOURCE:lg_mesg_emis=%d,port=%d,nb_envois=%d,TP=%s,dest=%s\n", + lg,port,nb_message,(udp)?"UDP":"TCP",nom_machine_distante); + } else { + printf("PUITS:lg_mesg-lu=%d,port=%d,nb_receptions=",lg,port); + if (nb_message!=-1 && !source) { + printf("infini"); + } + else { + printf("%d",nb_message); + } + printf(", TP=%s\n",(udp)?"UDP":"TCP"); + } + + + // Communnication through UDP messages + if (udp==1){ + // Creation du socket local + int sock= socket(AF_INET,SOCK_DGRAM,0); + + if (source==1) { + + + + // Creation de l'adresse du socket distant + struct hostent *hp ; + struct sockaddr_in adr_dest; + int longueur_adr_dest = sizeof(adr_dest); + + int longueur_message = lg; + + memset((char *)& adr_dest, 0, sizeof(adr_dest)) ; + + adr_dest.sin_family=AF_INET; + adr_dest.sin_port=port; + + + if ((hp = gethostbyname(nom_machine_distante)) == NULL) { + printf("erreur gethostbyname\n") ; + exit(1) ; + } + + memcpy( (char*)&(adr_dest.sin_addr.s_addr), + hp->h_addr, + hp->h_length ) ; + + for (int i = 0; i < nb_message; i++) { + // Construction du message + construire_message(message, 'a' + (i % 26), lg, i+1); + + // Envoi du message + afficher_message_envoi(message,lg,i+1); + sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest); + } + + + } + + else { + + + // Creation de l'adresse du socket distant + struct sockaddr_in adr_locale; + int longueur_adr_locale = sizeof(adr_locale); + + memset((char *)& adr_locale, 0, sizeof(adr_locale)) ; + + adr_locale.sin_family=AF_INET; + adr_locale.sin_port=port; + adr_locale.sin_addr.s_addr = INADDR_ANY; + + // Bind the local socket to any local address (ie any available interface) + if (bind(sock, (struct sockaddr *) &adr_locale, longueur_adr_locale) == -1) { + printf("failed to bind\n"); + exit(1); + } + + // Suivi du numéro de message reçu + int k=0; + + while (recvfrom(sock, message, lg, 0, NULL, NULL)) { + + k++; + // Afficher notre seule et unique triste message + afficher_message_reception(message, lg, k); + } + + + + + } + } + + else{ + + // Creation du socket local + int sock= socket(AF_INET,SOCK_STREAM,0); + + if (source==1) { + + + + // Creation de l'adresse du socket distant + struct hostent *hp ; + struct sockaddr_in adr_dest; + int longueur_adr_dest = sizeof(adr_dest); + + int longueur_message = lg; + + memset((char *)& adr_dest, 0, sizeof(adr_dest)) ; + + adr_dest.sin_family=AF_INET; + adr_dest.sin_port=port; + + + if ((hp = gethostbyname(nom_machine_distante)) == NULL) { + printf("erreur gethostbyname\n") ; + exit(1) ; + } + + memcpy( (char*)&(adr_dest.sin_addr.s_addr), + hp->h_addr, + hp->h_length ) ; + + // Demande de connexion + int succ; + if ((succ=connect(sock,(struct sockaddr*) &adr_dest,longueur_adr_dest))!=0){ + printf("Echec connect"); + exit(1); + } + + // Envoi des messages + for (int i = 0; i < nb_message; i++) { + // Construction du message + construire_message(message, 'a' + (i % 26), lg, i+1); + afficher_message_envoi(message,lg,i+1); + // Envoi du message + write(sock,message,longueur_message); + } + + // Close socket to avoid dangling connections + close(sock); + + + } + + else { + + + // Creation de l'adresse du socket local + struct sockaddr_in adr_locale; + socklen_t longueur_adr_locale = sizeof(adr_locale); + + int longueur_message = lg; + + memset((char *)& adr_locale, 0, sizeof(adr_locale)) ; + + adr_locale.sin_family=AF_INET; + adr_locale.sin_port=port; + adr_locale.sin_addr.s_addr = INADDR_ANY; + + // Bind the local socket to any local address (ie any available interface) + if (bind(sock, (struct sockaddr *) &adr_locale, longueur_adr_locale) == -1) { + printf("failed to bind\n"); + exit(1); + } + + // set listening queue size + if (listen(sock, QUEUE_SIZE) == -1) { + printf("échec et mat listen\n"); + exit(1); + } + + int sock_bis; + + while(1) { + // Accept a single connection on the main thread + if ((sock_bis = accept( sock, (struct sockaddr *)&adr_locale, &longueur_adr_locale)) == -1){ + printf("échec du accept\n") ; + exit(1) ; + } + printf("socket accepte:%d\n",sock_bis); + + + switch (fork() ) { + case - 1 : /* il y a une erreur */ + printf("erreur fork\n") ; exit(1) ; + case 0 : /* on est dans le proc. fils */ + close(sock) ; /* fermeture socket du proc. père */ + for (int i=0 ; i < nb_message ; i ++) { + if ((read(sock_bis, message, longueur_message)) < 0){ + printf("échec du read\n") ; exit(1) ;} + afficher_message_reception(message, longueur_message,i+1) ; + } + close(sock_bis); + exit(0) ; + default : /* on est dans le proc. père */ + close(sock_bis) ; /* fermeture socket du proc. fils + Connexion stay opened for further exchanges */ + } + } + } + } + + exit(0); +} + + +void construire_message(char *message, char motif, int lg, int numero_envoi) { + int i; + snprintf(message, lg,"% 5d",numero_envoi); + for (i=5;i