Compare commits

..

No commits in common. "65dbca6efad1d8e9cf04968e2b967d509fe1ad93" and "a6b814922b1bfa2d93860c5f24a582732b9c7b18" have entirely different histories.

6 changed files with 1112 additions and 1117 deletions

View file

@ -10,16 +10,7 @@
Compile version `X` : Compile version `X` :
``` ```
gcc -Wall -Wpedantic tsock_vX.c -o t_sockvX gcc -Wall -Wpedantic t_sockvX.c -o t_sockvX
```
Or compile all versions:
```
gcc -Wall -Wpedantic tsock_v1.c -o t_sockv1
gcc -Wall -Wpedantic tsock_v2.c -o t_sockv2
gcc -Wall -Wpedantic tsock_v3.c -o t_sockv3
gcc -Wall -Wpedantic tsock_v4.c -o t_sockv4
``` ```
Generate zip archive (replace `TP1` with relevant indication) : Generate zip archive (replace `TP1` with relevant indication) :
@ -31,51 +22,11 @@ zip LACAU-ALNET-TP1.zip tsock_v*.c README.md
## Running ## Running
``` TODO help output
usage: ./t_sockv1 <-u> [-ps] [host] <port>
parameters: host With -s, address of the host to connect to. Required with -s.
port Port to connect or bind to. Required.
options: -p Runs a TCP/UDP sink. Incompatible with -s.
-s Runs a TCP/UDP faucet. Incompatible with -p.
-u Use UDP instead of TCP. Required.
usage: ./t_sockv2 [-psu] [host] <port>
parameters: host With -s, address of the host to connect to. Required with -s.
port Port to connect or bind to. Required.
options: -p Runs a TCP/UDP sink. Incompatible with -s.
-s Runs a TCP/UDP faucet. Incompatible with -p.
-u Use UDP instead of TCP.
usage: ./t_sockv3 [-psu] [-n nb_messages] [-l mess_length] [host] <port>
parameters: host With -s, address of the host to connect to. Required with -s.
port Port to connect or bind to. Required.
options: -l mess_length Size of the messages to send. Min 5. Max 1400. Default 30.
-n nb_messages Number of messages to send. Min 1. Default 10. Ignored with -p.
-p Runs a TCP/UDP sink. Incompatible with -s.
-s Runs a TCP/UDP faucet. Incompatible with -p.
-u Use UDP instead of TCP.
```
Example usage of v3 :
```
./t_sockv3 -p -l 15 4000 # receiver
./t_sockv3 -s -l 15 localhost 4000 # sender
```
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
```
## Roadmap ## Roadmap
- [X] tsock-v1 - [X] tsock-v1
- [X] tsock-v2 - [X] tsock-v2
- [X] tsock-v3 - [WIP] tsock-v3
- [X] tsock-v4 - [ ] tsock-v4
- [X] server can handle multiple requests simultaneously
- [X] server doesn't stop after the connection ends
- [X] both client and server can assume sender/receiver roles

View file

@ -18,7 +18,7 @@
/* pour la gestion des erreurs */ /* pour la gestion des erreurs */
#include <errno.h> #include <errno.h>
int main (int argc, char **argv) void main (int argc, char **argv)
{ {
int c; int c;
extern char *optarg; extern char *optarg;

View file

@ -19,12 +19,23 @@
#include <errno.h> #include <errno.h>
#define BASE_SIZE 10 #define BASE_SIZE 10
void construire_message(char *message, char motif, int lg) {
int i;
for (i=0;i<lg;i++) message[i] = motif;
}
void construire_message(char *message, char motif, int lg); void afficher_message(char *message, int lg) {
void afficher_message(char *message, int lg); int i;
void print_usage(char* arg0); printf("message reçu : ");
for (i=0;i<lg;i++){
printf("%c", message[i]);
}
printf("\n");
}
int main (int argc, char **argv) {
int main (int argc, char **argv)
{
int c; int c;
extern char *optarg; extern char *optarg;
extern int optind; extern int optind;
@ -36,7 +47,7 @@ int main (int argc, char **argv) {
switch (c) { switch (c) {
case 'p': case 'p':
if (source == 1) { if (source == 1) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1); exit(1);
} }
source = 0; source = 0;
@ -44,7 +55,7 @@ int main (int argc, char **argv) {
case 's': case 's':
if (source == 0) { if (source == 0) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1) ; exit(1) ;
} }
source = 1; source = 1;
@ -59,8 +70,8 @@ int main (int argc, char **argv) {
break; break;
default: default:
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1); break;
} }
} }
@ -73,7 +84,7 @@ int main (int argc, char **argv) {
char* message = malloc(BASE_SIZE * sizeof(char)); char* message = malloc(BASE_SIZE * sizeof(char));
if (source == -1) { if (source == -1) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1) ; exit(1) ;
} }
@ -82,7 +93,9 @@ int main (int argc, char **argv) {
//Recuperation du nom logique //Recuperation du nom logique
nom_machine_distante=argv[argc-2]; nom_machine_distante=argv[argc-2];
} else }
else
printf("on est dans le puits\n"); printf("on est dans le puits\n");
if (nb_message != -1) { if (nb_message != -1) {
@ -96,6 +109,7 @@ int main (int argc, char **argv) {
printf("nb de tampons à envoyer = 10 par défaut\n"); printf("nb de tampons à envoyer = 10 par défaut\n");
} else } else
printf("nb de tampons à envoyer = infini\n"); printf("nb de tampons à envoyer = infini\n");
} }
if (udp==1){ if (udp==1){
@ -103,6 +117,9 @@ int main (int argc, char **argv) {
int sock= socket(AF_INET,SOCK_DGRAM,0); int sock= socket(AF_INET,SOCK_DGRAM,0);
if (source==1) { if (source==1) {
// Creation de l'adresse du socket distant // Creation de l'adresse du socket distant
struct hostent *hp ; struct hostent *hp ;
struct sockaddr_in adr_dest; struct sockaddr_in adr_dest;
@ -133,8 +150,14 @@ int main (int argc, char **argv) {
sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest); sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest);
} }
exit(0); exit(0);
} else { // UDP & Puit
}
else {
// Creation de l'adresse du socket distant // Creation de l'adresse du socket distant
struct sockaddr_in adr_locale; struct sockaddr_in adr_locale;
int longueur_adr_locale = sizeof(adr_locale); int longueur_adr_locale = sizeof(adr_locale);
@ -160,31 +183,12 @@ int main (int argc, char **argv) {
// Afficher notre seule et unique triste message // Afficher notre seule et unique triste message
afficher_message(message, longueur_message); afficher_message(message, longueur_message);
} }
exit(0); exit(0);
} }
} }
} }
void construire_message(char *message, char motif, int lg) {
int i;
for (i=0;i<lg;i++) message[i] = motif;
}
void afficher_message(char *message, int lg) {
int i;
printf("message reçu : ");
for (i=0;i<lg;i++){
printf("%c", message[i]);
}
printf("\n");
}
void print_usage(char* arg0) {
printf("usage: %s <-u> [-ps] [host] <port>\n", arg0);
printf("parameters: host With -s, address of the host to connect to. Required with -s.\n");
printf(" port Port to connect or bind to. Required.\n");
printf("options: -p Runs a TCP/UDP sink. Incompatible with -s.\n");
printf(" -s Runs a TCP/UDP faucet. Incompatible with -p.\n");
printf(" -u Use UDP instead of TCP. Required.\n");
}

View file

@ -19,11 +19,23 @@
#include <errno.h> #include <errno.h>
#define BASE_SIZE 10 #define BASE_SIZE 10
void construire_message(char *message, char motif, int lg); void construire_message(char *message, char motif, int lg) {
void afficher_message(char *message, int lg); int i;
void print_usage(char* arg0); for (i=0;i<lg;i++) message[i] = motif;
}
int main (int argc, char **argv) { void afficher_message(char *message, int lg) {
int i;
printf("message reçu : ");
for (i=0;i<lg;i++){
printf("%c", message[i]);
}
printf("\n");
}
int main (int argc, char **argv)
{
int c; int c;
extern char *optarg; extern char *optarg;
extern int optind; extern int optind;
@ -35,7 +47,7 @@ int main (int argc, char **argv) {
switch (c) { switch (c) {
case 'p': case 'p':
if (source == 1) { if (source == 1) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1); exit(1);
} }
source = 0; source = 0;
@ -43,7 +55,7 @@ int main (int argc, char **argv) {
case 's': case 's':
if (source == 0) { if (source == 0) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1) ; exit(1) ;
} }
source = 1; source = 1;
@ -58,8 +70,8 @@ int main (int argc, char **argv) {
break; break;
default: default:
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1); break;
} }
} }
@ -72,7 +84,7 @@ int main (int argc, char **argv) {
char* message = malloc(BASE_SIZE * sizeof(char)); char* message = malloc(BASE_SIZE * sizeof(char));
if (source == -1) { if (source == -1) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1) ; exit(1) ;
} }
@ -82,6 +94,7 @@ int main (int argc, char **argv) {
} else printf("PUITS:"); } else printf("PUITS:");
if (nb_message != -1) { if (nb_message != -1) {
if (source == 1) if (source == 1)
printf("nb de tampons à envoyer : %d\n", nb_message); printf("nb de tampons à envoyer : %d\n", nb_message);
@ -93,6 +106,7 @@ int main (int argc, char **argv) {
printf("nb de tampons à envoyer = 10 par défaut\n"); printf("nb de tampons à envoyer = 10 par défaut\n");
} else } else
printf("nb de tampons à envoyer = infini\n"); printf("nb de tampons à envoyer = infini\n");
} }
if (udp==1){ if (udp==1){
@ -133,7 +147,13 @@ int main (int argc, char **argv) {
sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest); sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest);
} }
} else { // UDP & puit
}
else {
// Creation de l'adresse du socket distant // Creation de l'adresse du socket distant
struct sockaddr_in adr_locale; struct sockaddr_in adr_locale;
int longueur_adr_locale = sizeof(adr_locale); int longueur_adr_locale = sizeof(adr_locale);
@ -159,12 +179,22 @@ int main (int argc, char **argv) {
// Afficher notre seule et unique triste message // Afficher notre seule et unique triste message
afficher_message(message, longueur_message); afficher_message(message, longueur_message);
} }
} }
} else { // TCP }
else{
// Creation du socket local // Creation du socket local
int sock= socket(AF_INET,SOCK_STREAM,0); int sock= socket(AF_INET,SOCK_STREAM,0);
if (source==1) { if (source==1) {
// Creation de l'adresse du socket distant // Creation de l'adresse du socket distant
struct hostent *hp ; struct hostent *hp ;
struct sockaddr_in adr_dest; struct sockaddr_in adr_dest;
@ -205,7 +235,13 @@ int main (int argc, char **argv) {
// Close socket to avoid dangling connections // Close socket to avoid dangling connections
close(sock); close(sock);
} else { // TCP & puit
}
else {
// Creation de l'adresse du socket local // Creation de l'adresse du socket local
struct sockaddr_in adr_locale; struct sockaddr_in adr_locale;
socklen_t longueur_adr_locale = sizeof(adr_locale); socklen_t longueur_adr_locale = sizeof(adr_locale);
@ -242,31 +278,13 @@ int main (int argc, char **argv) {
} }
close(sock_bis); close(sock_bis);
close(sock); close(sock);
} }
} }
exit(0); exit(0);
} }
void construire_message(char *message, char motif, int lg) {
int i;
for (i=0;i<lg;i++) message[i] = motif;
}
void afficher_message(char *message, int lg) {
int i;
printf("message reçu : ");
for (i=0;i<lg;i++){
printf("%c", message[i]);
}
printf("\n");
}
void print_usage(char* arg0) {
printf("usage: %s [-psu] [host] <port>\n", arg0);
printf("parameters: host With -s, address of the host to connect to. Required with -s.\n");
printf(" port Port to connect or bind to. Required.\n");
printf("options: -p Runs a TCP/UDP sink. Incompatible with -s.\n");
printf(" -s Runs a TCP/UDP faucet. Incompatible with -p.\n");
printf(" -u Use UDP instead of TCP.\n");
}

View file

@ -17,21 +17,18 @@
#include <stdio.h> #include <stdio.h>
/* pour la gestion des erreurs */ /* pour la gestion des erreurs */
#include <errno.h> #include <errno.h>
#define BASE_SIZE 10
// Remplit le message de lg caractères motif
void construire_message(char *message, char motif, int lg, int numero_envoi); void construire_message(char* message, char motif, int lg);
// Affichage distinct entre envoi et reception pour une facilité d'utilisation // 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_envoi(char *message, int lg, int numero_envoi);
void afficher_message_reception(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 ...] // Permet de compter le nombre de digits d'un nombre, utile pour l'affichage [--143 ...]
// (base 10)
int count_digits(int lg); int count_digits(int lg);
// Affiche l'usage de l'outil
void print_usage(char* arg0);
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
@ -47,7 +44,7 @@ int main (int argc, char **argv)
switch (c) { switch (c) {
case 'p': case 'p':
if (source == 1) { if (source == 1) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1); exit(1);
} }
source = 0; source = 0;
@ -55,7 +52,7 @@ int main (int argc, char **argv)
case 's': case 's':
if (source == 0) { if (source == 0) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1) ; exit(1) ;
} }
source = 1; source = 1;
@ -66,12 +63,10 @@ int main (int argc, char **argv)
// Packets are numerotated with 5 figures, which means the number of // Packets are numerotated with 5 figures, which means the number of
// packets send can't be bigger than (or equal) 10 ** 6 // packets send can't be bigger than (or equal) 10 ** 6
if(nb_message >= 100000) { if(nb_message >= 100000) {
printf("Too many packets. (Max 99999)\n"); printf("Too many packets");
exit(1);
} else if (nb_message <= 0) {
printf("Lets try to send all at least one message (:\n");
exit(1); exit(1);
} }
break; break;
case 'u': case 'u':
@ -83,19 +78,14 @@ int main (int argc, char **argv)
// A TCP packet is roughly 1500 bytes. We allow for some overhead. // A TCP packet is roughly 1500 bytes. We allow for some overhead.
// We provide an MTU of 1400 bytes. // We provide an MTU of 1400 bytes.
if(lg >= 1400) { if(lg >= 1400) {
printf("Messages too long (max 1400)\n"); printf("Messages too long");
exit(1);
} else if (lg < 5) {
// The message size includes the message number, whos size is 5.
printf("Messages too short (min 5)\n");
exit(1); exit(1);
} }
break; break;
default: default:
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1); break;
} }
} }
@ -115,7 +105,7 @@ int main (int argc, char **argv)
if (source == -1) { if (source == -1) {
print_usage(argv[0]); printf("usage: cmd [-p|-s][-n ##]\n");
exit(1) ; exit(1) ;
} }
@ -124,6 +114,7 @@ int main (int argc, char **argv)
nb_message = 10 ; nb_message = 10 ;
} }
//Affichage des informations de communication initiée //Affichage des informations de communication initiée
if (source == 1) { if (source == 1) {
//Recuperation du nom logique //Recuperation du nom logique
@ -131,7 +122,7 @@ int main (int argc, char **argv)
printf("SOURCE:lg_mesg_emis=%d,port=%d,nb_envois=%d,TP=%s,dest=%s\n", 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); lg,port,nb_message,(udp)?"UDP":"TCP",nom_machine_distante);
} else { } else {
printf("PUITS:lg_mesg_lu=%d,port=%d,nb_receptions=",lg,port); printf("PUITS:lg_mesg-lu=%d,port=%d,nb_receptions=",lg,port);
if (nb_message!=-1 && !source) { if (nb_message!=-1 && !source) {
printf("infini"); printf("infini");
} }
@ -142,12 +133,15 @@ int main (int argc, char **argv)
} }
// Communnication through UDP datagrams // Communnication through UDP messages
if (udp==1){ if (udp==1){
// Creation du socket local // Creation du socket local
int sock= socket(AF_INET,SOCK_DGRAM,0); int sock= socket(AF_INET,SOCK_DGRAM,0);
if (source==1) { if (source==1) {
// Creation de l'adresse du socket distant // Creation de l'adresse du socket distant
struct hostent *hp ; struct hostent *hp ;
struct sockaddr_in adr_dest; struct sockaddr_in adr_dest;
@ -172,14 +166,20 @@ int main (int argc, char **argv)
for (int i = 0; i < nb_message; i++) { for (int i = 0; i < nb_message; i++) {
// Construction du message // Construction du message
construire_message(message, 'a' + (i % 26), lg, i+1); construire_message(message, 'a' + (i % 26), lg);
// Envoi du message // Envoi du message
afficher_message_envoi(message,lg,i+1); afficher_message_envoi(message,lg,i+1);
sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest); sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest);
} }
} else { // UDP & puit
// Creation de l'adresse du socket local
}
else {
// Creation de l'adresse du socket distant
struct sockaddr_in adr_locale; struct sockaddr_in adr_locale;
int longueur_adr_locale = sizeof(adr_locale); int longueur_adr_locale = sizeof(adr_locale);
@ -196,21 +196,31 @@ int main (int argc, char **argv)
} }
// Suivi du numéro de message reçu // Suivi du numéro de message reçu
int k=1; int k=0;
while (1) { while (1) {
// Receive a single message because we are lazy // Receive a single message because we are lazy
recvfrom(sock, message, lg, 0, NULL, NULL); recvfrom(sock, message, lg, 0, NULL, NULL);
k++;
// Afficher notre seule et unique triste message // Afficher notre seule et unique triste message
afficher_message_reception(message, lg, k); afficher_message_reception(message, lg, k);
k++; }
} }
} }
} else { // TCP
else{
// Creation du socket local // Creation du socket local
int sock= socket(AF_INET,SOCK_STREAM,0); int sock= socket(AF_INET,SOCK_STREAM,0);
if (source==1) { if (source==1) {
// Creation de l'adresse du socket distant // Creation de l'adresse du socket distant
struct hostent *hp ; struct hostent *hp ;
struct sockaddr_in adr_dest; struct sockaddr_in adr_dest;
@ -236,14 +246,14 @@ int main (int argc, char **argv)
// Demande de connexion // Demande de connexion
int succ; int succ;
if ((succ=connect(sock,(struct sockaddr*) &adr_dest,longueur_adr_dest))!=0){ if ((succ=connect(sock,(struct sockaddr*) &adr_dest,longueur_adr_dest))!=0){
printf("Echec connect\n"); printf("Echec connect");
exit(1); exit(1);
} }
// Envoi des messages // Envoi des messages
for (int i = 0; i < nb_message; i++) { for (int i = 0; i < nb_message; i++) {
// Construction du message // Construction du message
construire_message(message, 'a' + (i % 26), lg, i+1); construire_message(message, 'a' + (i % 26), lg);
afficher_message_envoi(message,lg,i+1); afficher_message_envoi(message,lg,i+1);
// Envoi du message // Envoi du message
write(sock,message,longueur_message); write(sock,message,longueur_message);
@ -251,7 +261,13 @@ int main (int argc, char **argv)
// Close socket to avoid dangling connections // Close socket to avoid dangling connections
close(sock); close(sock);
} else { // TCP & puit
}
else {
// Creation de l'adresse du socket local // Creation de l'adresse du socket local
struct sockaddr_in adr_locale; struct sockaddr_in adr_locale;
socklen_t longueur_adr_locale = sizeof(adr_locale); socklen_t longueur_adr_locale = sizeof(adr_locale);
@ -276,7 +292,7 @@ int main (int argc, char **argv)
exit(1); exit(1);
} }
int sock_bis; // Socket correspondant à la connexion TCP initiée par la source int sock_bis;
// Accept a single connection on the main thread // Accept a single connection on the main thread
if ((sock_bis = accept( sock, (struct sockaddr *)&adr_locale, &longueur_adr_locale)) == -1){ if ((sock_bis = accept( sock, (struct sockaddr *)&adr_locale, &longueur_adr_locale)) == -1){
printf("échec du accept\n") ; printf("échec du accept\n") ;
@ -284,7 +300,7 @@ int main (int argc, char **argv)
} }
// Suivi du numéro de message reçu // Suivi du numéro de message reçu
int k=1; int k=0;
while (read(sock_bis, message, longueur_message) > 0) { while (read(sock_bis, message, longueur_message) > 0) {
afficher_message_reception(message, longueur_message,k); afficher_message_reception(message, longueur_message,k);
@ -299,16 +315,23 @@ int main (int argc, char **argv)
} }
void construire_message(char *message, char motif, int lg, int numero_envoi) { void construire_message(char *message, char motif, int lg) {
int i; int i;
snprintf(message, lg,"% 5d",numero_envoi); for (i=0;i<lg;i++) message[i] = motif;
for (i=5;i<lg;i++) message[i] = motif;
} }
void afficher_message_envoi(char *message, int lg, int numero_envoi) { void afficher_message_envoi(char *message, int lg, int numero_envoi) {
int i; int i;
printf("SOURCE: Envoi n°%d (%d) [",numero_envoi,lg); printf("SOURCE: Envoi n°%d (%d) [",numero_envoi,lg);
int nb_digits = count_digits(numero_envoi);
for (int l=5; l>nb_digits; l--) {
printf("-");
}
printf("%d",numero_envoi);
for (i=0;i<lg;i++){ for (i=0;i<lg;i++){
printf("%c", message[i]); printf("%c", message[i]);
} }
@ -319,19 +342,29 @@ void afficher_message_reception(char *message, int lg, int numero_envoi) {
int i; int i;
printf("PUITS: Reception n°%d (%d) [",numero_envoi,lg); printf("PUITS: Reception n°%d (%d) [",numero_envoi,lg);
int nb_digits = count_digits(numero_envoi);
for (int l=5; l>nb_digits; l--) {
printf("-");
}
printf("%d",numero_envoi);
for (i=0;i<lg;i++){ for (i=0;i<lg;i++){
printf("%c", message[i]); printf("%c", message[i]);
} }
printf("]\n"); printf("]\n");
} }
int count_digits(int lg) { int count_digits(int lg) {
int retour; int retour;
if (!lg){ if (!lg){
retour=1; retour=1;
} else { }
else {
retour=0; retour=0;
while (lg > 0) { while (lg > 0) {
lg/=10; lg/=10;
@ -341,14 +374,3 @@ int count_digits(int lg) {
return retour; return retour;
} }
void print_usage(char* arg0) {
printf("usage: %s [-psu] [-n nb_messages] [-l mess_length] [host] <port>\n", arg0);
printf("parameters: host With -s, address of the host to connect to. Required with -s.\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(" -u Use UDP instead of TCP.\n");
}