diff --git a/README.md b/README.md index 5ccaca1..fed47d0 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,12 @@ Example usage of v3 : Example usage of v4 : ``` -./t_sockv3 -C -e -n 20 -l 15 localhost 4000 # client sender -./t_sockv3 -S -r -n 20 -l 15 4000 # server receiver +./t_sockv4 -S -r -n 20 -l 15 4000 # server receiver +./t_sockv4 -C -e -n 20 -l 15 localhost 4000 # client sender + +./t_sockv4 -S -e -n 20 -l 15 4000 # server sender +./t_sockv4 -C -r -n 20 -l 15 localhost 4000 # client receiver + ``` ## Roadmap diff --git a/tsock_v3.c b/tsock_v3.c index 5112285..b2102f2 100644 --- a/tsock_v3.c +++ b/tsock_v3.c @@ -26,7 +26,7 @@ void afficher_message_envoi(char *message, int lg, int numero_envoi); void afficher_message_reception(char *message, int lg, int numero_envoi); // Permet de compter le nombre de digits d'un nombre, utile pour l'affichage [--143 ...] -// (base 10) +// (base 10). Première solution d'affichage mais nous nous servons finalement de snprintf(). int count_digits(int lg); // Affiche l'usage de l'outil diff --git a/tsock_v4.c b/tsock_v4.c index 084ef40..74239fa 100644 --- a/tsock_v4.c +++ b/tsock_v4.c @@ -17,14 +17,17 @@ #include /* pour la gestion des erreurs */ #include -#define QUEUE_SIZE 5 +#define QUEUE_SIZE 5 // Taille de la file d'attente du listen() +// Remplit le message de lg caractères motif 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); +// Affiche l'usage de l'outil +void print_usage(char* arg0); int main (int argc, char **argv) { @@ -44,7 +47,7 @@ int main (int argc, char **argv) switch (c) { case 'p': if (source == 1) { - printf("usage: cmd [-p|-s][-n ##]\n"); + print_usage(argv[0]); exit(1); } source = 0; @@ -52,7 +55,7 @@ int main (int argc, char **argv) case 's': if (source == 0) { - printf("usage: cmd [-p|-s][-n ##]\n"); + print_usage(argv[0]); exit(1) ; } source = 1; @@ -62,11 +65,10 @@ int main (int argc, char **argv) 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); + if(nb_message >= 100000 || nb_message <= 0) { + print_usage(argv[0]); + exit(1); } - break; case 'u': @@ -79,77 +81,85 @@ int main (int argc, char **argv) // 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"); + print_usage(argv[0]); exit(1); } break; /* -c and -e options stand only for TCP exchange */ case 'C': client=1; - if (udp == 1){ - printf("No option -C for UDP"); + if (udp || serveur) { + print_usage(argv[0]); exit(0); } break; case 'S': serveur = 1; - if (udp == 1){ - printf("No option -S for UDP"); + if (udp || client) { + print_usage(argv[0]); exit(0); } break; case 'e': emetteur=1; - if (udp == 1 || recepteur == 1){ - printf("Missuse of -e option"); + if (udp || recepteur) { + print_usage(argv[0]); exit(0); } break; case 'r': recepteur=1; - if (udp == 1 || emetteur == 1){ - printf("Missuse of -r option"); - exit(0); + if (udp || emetteur) { + print_usage(argv[0]); + exit(0); } break; default: - printf("usage: cmd [-p|-s][-n ##]\n"); + print_usage(argv[0]); break; } } - if (!recepteur && !emetteur && !udp) { - printf("Need to specify sender or receiver for TCP connexion"); - exit(0); + // Little verification of TCP arguments. + // Machine must be a server or a client as once, + // as well as a sender or receiver. + if (!udp) { + if ((!recepteur && !emetteur) || (!serveur && !client)) { + print_usage(argv[0]); + exit(0); + } } + // Variable qui va stocker le nom logique de la machine avec qui on communique char* nom_machine_distante; + //Allocation de la variable stockant un message, il est de la taille donnée en paramètre + char* message = malloc(lg * sizeof(char)); + // 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 number of messages is not fixed for the source, it is set to 10 messages - if (nb_message == -1 && source ) { + // If number of messages is not fixed for the source, it is set to 10 messages + if (nb_message == -1 && (source || !udp)) { nb_message = 10 ; } //Affichage des informations de communication initiée - if (source || client) { + if (source || emetteur) { //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); + printf("SOURCE:lg_mesg_emis=%d,port=%d,nb_envois=%d,TP=%s", + lg,port,nb_message,(udp)?"UDP":"TCP"); + if (client) { + printf(",dest=%s",nom_machine_distante); + } + printf("\n"); } else { printf("PUITS:lg_mesg-lu=%d,port=%d,nb_receptions=",lg,port); if (nb_message!=-1 && !source) { @@ -278,7 +288,7 @@ int main (int argc, char **argv) } - // Envoi des messages + // Envoi ou reception des messages for (int i = 0; i < nb_message; i++) { if (emetteur){ @@ -296,19 +306,12 @@ int main (int argc, char **argv) } } - - - // Close socket to avoid dangling connections close(sock); - - } // The server shall accept the connexion if (serveur) { - - // Creation de l'adresse du socket local struct sockaddr_in adr_locale; socklen_t longueur_adr_locale = sizeof(adr_locale); @@ -327,7 +330,7 @@ int main (int argc, char **argv) exit(1); } - // set listening queue size + // Set listening queue size if (listen(sock, QUEUE_SIZE) == -1) { printf("échec et mat listen\n"); exit(1); @@ -341,17 +344,17 @@ int main (int argc, char **argv) printf("échec du accept\n") ; exit(1) ; } - printf("socket accepte:%d\n",sock_bis); - + // On crée un processus pour chaque connexion TCP acceptée 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 ++) { - - // Server send packets + // Server sends packets with -e if (emetteur){ // Construction du message construire_message(message, 'a' + (i % 26), lg, i+1); @@ -359,7 +362,7 @@ int main (int argc, char **argv) // Envoi du message write(sock_bis,message,longueur_message); } - // Server receives packets + // Server receives packets with -r if (recepteur) { if ((read(sock_bis, message, longueur_message)) < 0){ printf("échec du read\n") ; exit(1) ;} @@ -406,4 +409,17 @@ void afficher_message_reception(char *message, int lg, int numero_envoi) { } +void print_usage(char* arg0) { + printf("usage: %s [-psuCSer] [-n nb_messages] [-l mess_length] [host] \n", arg0); + printf("parameters: host With -s or -C, address of the host to connect to. Required with -s or -C.\n"); + printf(" port Port to connect or bind to. Required.\n"); + printf("options: -l mess_length Size of the messages to send. Min 5. Max 1400. Default 30.\n"); + printf(" -n nb_messages Number of messages to send. Min 1. Default 10. Ignored with -p.\n"); + printf(" -p Runs a TCP/UDP sink. Incompatible with -s.\n"); + printf(" -s Runs a TCP/UDP faucet. Incompatible with -p.\n"); + printf(" -C Client of a TCP connexion. Incompatible with -S and -u. Requires -e or -r.\n"); + printf(" -S Server of a TCP connexion. Incompatible with -C and -u. Requires -e or -r.\n"); + printf(" -e Packets issuer of a TCP connexion. Incompatible with -r and -u.\n"); + printf(" -r Packets receiver of a TCP connexion. Incompatible with -e and -u.\n"); +}