commit 3caaa99da2e4e3766743e5b7f819f8fafc683e2d Author: BQUINTAN Date: Tue Apr 14 12:51:12 2020 +0200 V3 temrinée diff --git a/ProgC_Q.zip b/ProgC_Q.zip new file mode 100644 index 0000000..1562e5b Binary files /dev/null and b/ProgC_Q.zip differ diff --git a/makefile b/makefile new file mode 100644 index 0000000..fe88be5 --- /dev/null +++ b/makefile @@ -0,0 +1,3 @@ +tsock: tsock_v3.c tsock.h + gcc tsock_v3.c -o tsock_v3 -g + diff --git a/tsock.h b/tsock.h new file mode 100644 index 0000000..3cf7af6 --- /dev/null +++ b/tsock.h @@ -0,0 +1,421 @@ +//--------------------------PROG C ET RESEAUX----------------------- +//Nom : Quintana ----------------------------------------------- +//Prénom : Béranger ----------------------------------------------- +//Groupe : 3AE E ----------------------------------------------- +//------------------------------------------------------------------ + +#ifndef __tsock__ + +//--------------------------------------------------- +//-------------Déclaration des fonctions------------- +//--------------------------------------------------- + +void construire_message(char *message, char motif, int lg, int i); +void afficher_message(char *message, int lg); +void envoi_UDP(int port, int nb_message , int lg_msg, char*dest); +void reception_UDP(int port, int nb_message , int lg_message); +void ClientTCP (int port, int nb_message , int lg_msg, char* dest); +void ServeurTCP(int port , int nb_message, int lg_msg); +void printbuffer(int n); + + + +//--------------------------------------------------- +//-------------Définitions des fonctions------------- +//--------------------------------------------------- + +//Construction des messages + +void construire_message(char *message, char motif, int lg ,int i) + +{ + char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; + if (i>26) + { + motif=alphabet[i%26-1]; + } + else + { + motif=alphabet[i-1]; + } + + for (int j=0;j=10 & n<100) + { + printf("[---%d",n); + } + if (n>=100 & n<1000) + { + printf("[--%d",n); + } + if (n>=1000 & n<10000) + { + printf("[--%d",n); + } + if (n>=10000 & n<100000) + { + printf("[-%d",n); + } + if (n>=100000 & n<1000000) + { + printf("[%d",n); + } + if (n>=1000000) + { + printf("Trop de messages à envoyer (n>1000000 \n"); + exit(1); + } +} + +//---------------------------------------------------- +//----------------Envoi UDP--------------------------- +//---------------------------------------------------- + +void envoi_UDP(int port ,int nb_mess , int lg_msg,char*dest) + + +{ + + int length_addr_dist; + length_addr_dist=sizeof(struct sockaddr_in); + + int sock; + int sent; + struct sockaddr_in addr_distant; + struct hostent* hp; + char *message=malloc(sizeof(char)*lg_msg) ; + + if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur (socket retourne -1 si le socket ne s'ouvre pas comme il faut + { + printf("Erreur à la création du socket\n"); + exit(1); + } + memset((char*)&addr_distant,0,sizeof(addr_distant)); + addr_distant.sin_family=AF_INET; + addr_distant.sin_port=port; + + if((hp=gethostbyname(dest))==NULL) + { + printf("Erreur gethostbyname\n"); + exit(1); + } + + printf("Après gethostbyname , nb_message= %d\n",nb_mess); + + memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr, hp->h_length); + printf("Association IP OK\n"); + printf("Nombre de messages à envoyer : %d\n", nb_mess); + + for (int i=1; i<=nb_mess ; i++) + { + construire_message(message,'a',lg_msg,i); + printf("SOURCE : Envoi n°%d (%d) ", i, lg_msg); + + + if((sent=sendto(sock,message,lg_msg,0,(struct sockaddr*)&addr_distant,sizeof(addr_distant)))==-1) + { + printf("Erreur sendto\n"); + exit(1); + } + printbuffer(i); + afficher_message(message,sent); + } + + if(close(sock)==-1) //fermeture + test erreur à la fermeture + { + printf("Echec à la destruction du socket\n"); + exit(1); + } +} + +//---------------------------------------------------- +//------------------Reception UDP--------------------- +//---------------------------------------------------- + +void reception_UDP(int port, int nb_message, int lg_message) +{ + + int sock; + struct sockaddr_in addr_local,addr_distant; + int recv; + int lg_dist; + char *message=malloc(sizeof(char)*lg_message) ; + + if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) //création du socket + test erreur d'ouverture + { + printf("Erreur à la création du socket\n"); + exit(1); + } + + memset((char*)&addr_local,0,sizeof(addr_local));//reset de addr_local + addr_local.sin_family=AF_INET; //attribution des différents attributs de addr_local + addr_local.sin_port=port; + addr_local.sin_addr.s_addr=INADDR_ANY; //On dit que l'on veut recevoir sur n'importe quelle carte réseau de notre machine (=INADDR_ANY) + + + if ((bind(sock,(struct sockaddr*)&addr_local, sizeof(addr_local)))==-1) //bind de la réception + test erreur du bind + { + printf("Echec du Bind\n"); + exit(1); + } + + //printf("bind OK\n"); + + if (nb_message==-1) + nb_message=10; + + //printf("%d messages à recevoir\n",nb_message); + lg_dist=sizeof(addr_distant); + //printf("lg_dist initialisé\n"); + + for (int i=1 ; i<=nb_message ; i++) + { + + recv=recvfrom(sock,message,lg_message,0,(struct sockaddr*)&addr_distant,&lg_dist); + if (recv==-1) //process de réception (recvfrom natif à l'API socket, + test erreur + { + printf("Erreur receive from\n"); + exit(1); + } + else + { + printf("PUITS : Réception n°%d (%d) :",i,lg_message); + printbuffer(i); + afficher_message(message,recv); + } + } + + if(close(sock)==-1) //fermeture + test erreur à la fermeture + { + printf("Echec à la destruction du socket\n"); + exit(1); + } +} + +//--------------------------------------------------------------- +//----------------ClientTCP <=> source=1------------------------- +//--------------------------------------------------------------- + +void ClientTCP (int port, int nb_message , int lg_msg , char* dest) +{ + //Déclarations + int sock; + struct sockaddr_in addr_distant ; + int lg_addr_distant=sizeof(addr_distant); + + struct hostent *hp; + char motif; + char * message=malloc(lg_msg*sizeof(char)); //Penser au free en fin de programme pour libérer l'espace mémoire + int envoi=-1; + +//--------------------------------------- +//--------Etablissement connexion-------- +//--------------------------------------- + + //Création socket + if((sock=socket(AF_INET,SOCK_STREAM,0))==-1) + { + printf("Erreur à l'ouverture du Socket Stream"); + exit(1); + } + + //Construction adresse socket distant + memset((char*)&addr_distant,0,sizeof(addr_distant)); + addr_distant.sin_family=AF_INET; //Internet + addr_distant.sin_port=port; //Numéro de Port + + //Affectation IP + if((hp=gethostbyname(dest))==NULL) + { + printf("Erreur de requête IP.\n"); + exit(1); + } + + memcpy((char*)&(addr_distant.sin_addr.s_addr), hp->h_addr , hp->h_length); + + //Demande de connexion + + if (connect(sock,(struct sockaddr *)&addr_distant,sizeof(addr_distant))==-1) + { + printf("Erreur lors de la connexion, en attente de la tentative suivante \n"); + + } + + //printf("Connexion Réussie !\n"); + +//----------------------------------------- +//----------TRANSFERT DE DONNEES----------- +//----------------------------------------- + + for (int i=1; i<=nb_message;i++) + { + printf("SOURCE : envoi n°%d (%d) ", i,lg_msg); + //Création du message + + construire_message(message,motif,lg_msg,i); + +// printbuffer(i); + afficher_message(message,lg_msg); + + //Envoi du message + + if ((envoi=sendto(sock,message,lg_msg,0,(struct sockaddr*)&addr_distant,lg_addr_distant))==-1) + { + printf("Echec de l'envoi du message (fonction send en défaut)\n"); + exit(1); + } + } + + //Fermeture connexion + + if(shutdown(sock,2)==-1) + { + printf("Erreur à la fermeture de la connexion TCP \n"); + exit(1); + } + + if (close(sock)==-1) + { + printf("Echec de la fermeture du socket distant"); + exit(1); + } + + free(message); + + printf("Envoi effectué avec succès\n"); +} + +//--------------------------------------------------------------- +//----------------ServeurTCP <=> source=0------------------------- +//--------------------------------------------------------------- + +void ServeurTCP(int port , int nb_message, int lg_msg) +{ + //Déclarations + int sock , sock2; //sock bis local orienté échanges + struct sockaddr* addr_distant; + struct sockaddr_in addr_local; + int lg_addr_distant=sizeof(addr_distant); + int lg_addr_local=sizeof(addr_local); + struct hostent *hp; + char motif; + char * message=malloc(lg_msg*sizeof(char)); //Penser au free en fin de programme pour libérer l'espace mémoire + int lg_recv=-1; + +//------------- +//Connexion --- +//------------- + + //Création socket local + + if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1) + { + printf("Echec de la création d'un socket local\n"); + exit(1); + } + + //Construction adresse socket local | Affectation port et domaine + + memset((char*)&addr_local, 0 , sizeof(addr_local)); + addr_local.sin_family=AF_INET; + addr_local.sin_addr.s_addr=INADDR_ANY; + addr_local.sin_port=port; + + //printf("Socket créé addressé\n"); + + //Bind + + if (bind(sock,(struct sockaddr *)&addr_local, lg_addr_local)==-1) + { + printf("Echec du bind.\n"); + exit(1); + } + //printf("bind effectué\n"); + + //Check connexions entrantes + + if (listen(sock,100)<0) + { + printf("Trop de connexions en attentes, échec de la demande\n"); + exit(1); + } + + //rintf("listen accepté\n"); + + + //Accept connexion + + + if (nb_message==-1) + { + nb_message=10; + } + if ((sock2 = accept(sock,(struct sockaddr*)&addr_distant,&lg_addr_distant))==-1) + { + printf("Refus de connexion par le serveur\n"); + exit(1); + } + //printf("Accept validé, %d messages à recevoir\n",nb_message); + //Reception des messages au niveau du socket d'échange + + for (int i=1;i<=nb_message;i++) + { + printf("PUITS : Réception n°%d (%d) " , i , lg_msg); + if((lg_recv=read(sock2,message, lg_msg))<0) + { + printf("Echec de la lecture du message entrant \n"); + exit(1); + } +// printbuffer(i); + afficher_message(message, lg_recv); + } + //Fermeture connexion + + if ((shutdown(sock , 2))==-1) + { + printf("Erreur à la fermeture de la connexion : shutdown\n"); + exit(1); + } + + //Ciao le socket + if(close(sock)==-1) + { + printf("Impossible de fermer le socket"); + } + + free(message); + + +} + +#endif diff --git a/tsock_v0.c b/tsock_v0.c new file mode 100644 index 0000000..168d258 --- /dev/null +++ b/tsock_v0.c @@ -0,0 +1,80 @@ +/* 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 + +void 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 */ + while ((c = getopt(argc, argv, "pn:s")) != -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); + break; + + default: + printf("usage: cmd [-p|-s][-n ##]\n"); + break; + } + } + + if (source == -1) { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1) ; + } + + if (source == 1) + printf("on est dans le source\n"); + else + printf("on est dans le puits\n"); + + if (nb_message != -1) { + if (source == 1) + printf("nb de tampons à envoyer : %d\n", nb_message); + else + printf("nb de tampons à recevoir : %d\n", nb_message); + } else { + if (source == 1) { + nb_message = 10 ; + printf("nb de tampons à envoyer = 10 par défaut\n"); + } else + printf("nb de tampons à envoyer = infini\n"); + + } +} + diff --git a/tsock_v1_1.c b/tsock_v1_1.c new file mode 100644 index 0000000..8187c52 --- /dev/null +++ b/tsock_v1_1.c @@ -0,0 +1,157 @@ +//--------------------------PROG C ET RESEAUX----------------------- +//Nom : Quintana ----------------------------------------------- +//Prénom : Béranger ----------------------------------------------- +//Groupe : 3AE E ----------------------------------------------- +//------------------------------------------------------------------ + + +/* 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 +/* fonctions de tsock*/ +#include "tsock.h" + + +/********************************************************************** +Programme Principal +**********************************************************************/ + +void main (int argc, char **argv) +{ + + //Déclarations + + 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 tcp=1; //tcp=1 => tcp ; tcp=0 =>udp + struct hostent *hp; + + int port = -1; //Numéro de port + port =htons(port); + + char *dest ; + int lg_local; + + while ((c = getopt(argc, argv, "pn:su")) != -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) ; + } + dest=argv[argc-2]; + source = 1; + break; + + case 'n': + nb_message = atoi(optarg); + break; + + case 'u': + if (tcp ==0){ + printf("usage : cmd [-p| -s] [-u][-n##]\n"); + } + tcp=0; + break; + + default: + printf("usage: cmd [-p|-s][-n ##]\n"); + break; + } + } + + if ((port=atoi(argv[argc-1]))!=-1) + { + port=htons(port); + } + dest=argv[argc-2]; + + + if (source == -1) + { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1) ; + } + if (tcp==1) + { + printf("On utilise TCP\n"); + } + else + {printf("On utilise UDP\n");} + + + if (source == 1) + printf("on est dans le source\n"); + else + printf("on est dans le puits\n"); + + + if (nb_message != -1) + { + if (source == 1) + printf("nb de tampons à envoyer : %d\n", nb_message); + else + printf("nb de tampons à recevoir : %d\n", nb_message); + } + else + { + if (source == 1) + { + nb_message = 10 ; + printf("nb de tampons à envoyer = 10 par défaut\n"); + } + else + printf("nb de tampons à envoyer = infini\n"); + + } + + + //Envoi de message, Source en UDP + + int length_addr_dist; + length_addr_dist=sizeof(struct sockaddr_in); + + + + if(source==1 & tcp==0) + { + envoi_UDP(nb_message,port,50); + } + + //PUITS de réception en UDP + + else if (source==0 & tcp==0) + { + reception_UDP(port,nb_message,50); + } + exit(0); +} diff --git a/tsock_v2.c b/tsock_v2.c new file mode 100644 index 0000000..e8b4e9d --- /dev/null +++ b/tsock_v2.c @@ -0,0 +1,175 @@ +//--------------------------PROG C ET RESEAUX----------------------- +//Nom : Quintana ----------------------------------------------- +//Prénom : Béranger ----------------------------------------------- +//Groupe : 3AE E ----------------------------------------------- +//------------------------------------------------------------------ + + +/* 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 +/* fonctions de tsock*/ +#include "tsock.h" +/* pour afficher l'adresse d'un socket */ +#include + + +/********************************************************************** +Programme Principal +**********************************************************************/ + +void main (int argc, char **argv) +{ + + //Déclarations + + 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 tcp=1; //tcp=1 => tcp ; tcp=0 =>udp + struct hostent *hp; + + int port = -1; //Numéro de port + port =htons(port); + + char *dest ; + int lg_local; + + while ((c = getopt(argc, argv, "pn:su")) != -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) ; + } + dest=argv[argc-2]; + source = 1; + break; + + case 'n': + nb_message = atoi(optarg); + break; + + case 'u': + if (tcp ==0){ + printf("usage : cmd [-p| -s] [-u][-n##]\n"); + } + tcp=0; + break; + + default: + printf("usage: cmd [-p|-s][-n ##]\n"); + break; + } + } + + if ((port=atoi(argv[argc-1]))!=-1) + { + port=htons(port); + } + dest=argv[argc-2]; + + + if (source == -1) + { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1) ; + } + if (tcp==1) + { + printf("On utilise TCP\n"); + } + else + {printf("On utilise UDP\n");} + + + if (source == 1) + printf("on est dans le source\n"); + else + printf("on est dans le puits\n"); + + + if (nb_message != -1) + { + if (source == 1) + printf("nb de tampons à envoyer : %d\n", nb_message); + else + printf("nb de tampons à recevoir : %d\n", nb_message); + } + else + { + if (source == 1) + { + nb_message = 10 ; + printf("nb de tampons à envoyer = 10 par défaut\n"); + } + else + printf("nb de tampons à recevoir = infini\n"); + + } + + + //Envoi de message, Source en UDP + + int length_addr_dist; + length_addr_dist=sizeof(struct sockaddr_in); + + + + if(source==1 & tcp==0) + { + envoi_UDP(nb_message,port,30); + } + + //PUITS de réception en UDP + + else if (source==0 & tcp==0) + { + reception_UDP(port,nb_message,30); + } + + + else if (source==0 & tcp==1) + { + printf("On utilise TCP en puits\n"); + ServeurTCP(port, nb_message, 30); + } + + else if (source==1 & tcp==1) + { + printf("On utilise TCP en source\n"); + ClientTCP(port,nb_message,30); + } + + exit(0); +} + + diff --git a/tsock_v3 b/tsock_v3 new file mode 100644 index 0000000..fe680f6 Binary files /dev/null and b/tsock_v3 differ diff --git a/tsock_v3.c b/tsock_v3.c new file mode 100644 index 0000000..0f788c9 --- /dev/null +++ b/tsock_v3.c @@ -0,0 +1,184 @@ +//--------------------------PROG C ET RESEAUX----------------------- +//Nom : Quintana ----------------------------------------------- +//Prénom : Béranger ----------------------------------------------- +//Groupe : 3AE E ----------------------------------------------- +//------------------------------------------------------------------ + + +/* 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 +/* fonctions de tsock*/ +#include "tsock.h" +/* pour afficher l'adresse d'un socket */ +#include + + +/********************************************************************** +Programme Principal +**********************************************************************/ + +void main (int argc, char **argv) +{ + + //Déclarations + + 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 tcp=1; //tcp=1 => tcp ; tcp=0 =>udp + struct hostent *hp; + + int port = -1; //Numéro de port + port =htons(port); + + char *dest ; + int lg =30; + + 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) ; + } + dest=argv[argc-2]; + source = 1; + break; + + case 'n': + nb_message = atoi(optarg); + break; + + case 'u': + tcp=0; + break; + + case 'l': + lg = atoi(optarg); + break; + + default: + printf("usage: cmd [-p|-s][-n ##]\n"); + break; + } + } + + if ((port=atoi(argv[argc-1]))!=-1) + { + port=htons(port); + } + dest=argv[argc-2]; + + if (source == -1) + { + printf("usage: cmd [-p|-s][-n ##]\n"); + exit(1) ; + } + + if (source == 1) + printf("SOURCE : "); + else + printf("PUITS : "); + + + if (tcp==1) + printf("Protocole de transport : TCP | "); + + else + printf("Protocole de transport : UDP | "); + + if (nb_message == -1) + { + + if (source == 1) + { + nb_message = 10; + printf("Nombre d'envois : %d | ", nb_message); + } + else + printf("Nombre de receptions : infini | "); + } + + else + { + if (source == 1) + { + + printf("Nombre d'envois = %d | ", nb_message); + } + else + { + printf("nb de tampons à recevoir = %d | ",nb_message); + } + } + + printf("Destinataire : %s\n", dest); + + + //Envoi de message, Source en UDP + + int length_addr_dist; + length_addr_dist=sizeof(struct sockaddr_in); + + + if(source==1 & tcp==0) + { + envoi_UDP(port,nb_message,lg,dest); + } + + //PUITS de réception en UDP + + else if (source==0 & tcp==0) + { + reception_UDP(port,nb_message,lg); + } + + + else if (source==0 & tcp==1) + { + + ServeurTCP(port, nb_message, lg); + } + + else if (source==1 & tcp==1) + { + + ClientTCP(port,nb_message,lg,dest); + } + + exit(0); +} + +