V3 temrinée
This commit is contained in:
commit
3caaa99da2
8 changed files with 1020 additions and 0 deletions
BIN
ProgC_Q.zip
Normal file
BIN
ProgC_Q.zip
Normal file
Binary file not shown.
3
makefile
Normal file
3
makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
tsock: tsock_v3.c tsock.h
|
||||||
|
gcc tsock_v3.c -o tsock_v3 -g
|
||||||
|
|
421
tsock.h
Normal file
421
tsock.h
Normal file
|
@ -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<lg-5;j++)
|
||||||
|
{
|
||||||
|
|
||||||
|
*(message+j) = motif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------
|
||||||
|
//-------------Affichage des messages----------------
|
||||||
|
//---------------------------------------------------
|
||||||
|
|
||||||
|
void afficher_message(char *message, int lg)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0;i<lg;i++)
|
||||||
|
{
|
||||||
|
printf("%c", *(message+i));
|
||||||
|
}
|
||||||
|
printf("]\n");
|
||||||
|
}
|
||||||
|
void printbuffer(int n)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (n<10)
|
||||||
|
{
|
||||||
|
printf("[----%d",n);
|
||||||
|
}
|
||||||
|
if (n>=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
|
80
tsock_v0.c
Normal file
80
tsock_v0.c
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/* librairie standard ... */
|
||||||
|
#include <stdlib.h>
|
||||||
|
/* pour getopt */
|
||||||
|
#include <unistd.h>
|
||||||
|
/* déclaration des types de base */
|
||||||
|
#include <sys/types.h>
|
||||||
|
/* constantes relatives aux domaines, types et protocoles */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
/* constantes et structures propres au domaine UNIX */
|
||||||
|
#include <sys/un.h>
|
||||||
|
/* constantes et structures propres au domaine INTERNET */
|
||||||
|
#include <netinet/in.h>
|
||||||
|
/* structures retournées par les fonctions de gestion de la base de
|
||||||
|
données du réseau */
|
||||||
|
#include <netdb.h>
|
||||||
|
/* pour les entrées/sorties */
|
||||||
|
#include <stdio.h>
|
||||||
|
/* pour la gestion des erreurs */
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
157
tsock_v1_1.c
Normal file
157
tsock_v1_1.c
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
//--------------------------PROG C ET RESEAUX-----------------------
|
||||||
|
//Nom : Quintana -----------------------------------------------
|
||||||
|
//Prénom : Béranger -----------------------------------------------
|
||||||
|
//Groupe : 3AE E -----------------------------------------------
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/* librairie standard ... */
|
||||||
|
#include <stdlib.h>
|
||||||
|
/* pour getopt */
|
||||||
|
#include <unistd.h>
|
||||||
|
/* déclaration des types de base */
|
||||||
|
#include <sys/types.h>
|
||||||
|
/* constantes relatives aux domaines, types et protocoles */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
/* constantes et structures propres au domaine UNIX */
|
||||||
|
#include <sys/un.h>
|
||||||
|
/* constantes et structures propres au domaine INTERNET */
|
||||||
|
#include <netinet/in.h>
|
||||||
|
/* structures retournées par les fonctions de gestion de la base de
|
||||||
|
données du réseau */
|
||||||
|
#include <netdb.h>
|
||||||
|
/* pour les entrées/sorties */
|
||||||
|
#include <stdio.h>
|
||||||
|
/* pour la gestion des erreurs */
|
||||||
|
#include <errno.h>
|
||||||
|
/* 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);
|
||||||
|
}
|
175
tsock_v2.c
Normal file
175
tsock_v2.c
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
//--------------------------PROG C ET RESEAUX-----------------------
|
||||||
|
//Nom : Quintana -----------------------------------------------
|
||||||
|
//Prénom : Béranger -----------------------------------------------
|
||||||
|
//Groupe : 3AE E -----------------------------------------------
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/* librairie standard ... */
|
||||||
|
#include <stdlib.h>
|
||||||
|
/* pour getopt */
|
||||||
|
#include <unistd.h>
|
||||||
|
/* déclaration des types de base */
|
||||||
|
#include <sys/types.h>
|
||||||
|
/* constantes relatives aux domaines, types et protocoles */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
/* constantes et structures propres au domaine UNIX */
|
||||||
|
#include <sys/un.h>
|
||||||
|
/* constantes et structures propres au domaine INTERNET */
|
||||||
|
#include <netinet/in.h>
|
||||||
|
/* structures retournées par les fonctions de gestion de la base de
|
||||||
|
données du réseau */
|
||||||
|
#include <netdb.h>
|
||||||
|
/* pour les entrées/sorties */
|
||||||
|
#include <stdio.h>
|
||||||
|
/* pour la gestion des erreurs */
|
||||||
|
#include <errno.h>
|
||||||
|
/* fonctions de tsock*/
|
||||||
|
#include "tsock.h"
|
||||||
|
/* pour afficher l'adresse d'un socket */
|
||||||
|
#include <arpa/inet.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 à 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
BIN
tsock_v3
Normal file
BIN
tsock_v3
Normal file
Binary file not shown.
184
tsock_v3.c
Normal file
184
tsock_v3.c
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
//--------------------------PROG C ET RESEAUX-----------------------
|
||||||
|
//Nom : Quintana -----------------------------------------------
|
||||||
|
//Prénom : Béranger -----------------------------------------------
|
||||||
|
//Groupe : 3AE E -----------------------------------------------
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/* librairie standard ... */
|
||||||
|
#include <stdlib.h>
|
||||||
|
/* pour getopt */
|
||||||
|
#include <unistd.h>
|
||||||
|
/* déclaration des types de base */
|
||||||
|
#include <sys/types.h>
|
||||||
|
/* constantes relatives aux domaines, types et protocoles */
|
||||||
|
#include <sys/socket.h>
|
||||||
|
/* constantes et structures propres au domaine UNIX */
|
||||||
|
#include <sys/un.h>
|
||||||
|
/* constantes et structures propres au domaine INTERNET */
|
||||||
|
#include <netinet/in.h>
|
||||||
|
/* structures retournées par les fonctions de gestion de la base de
|
||||||
|
données du réseau */
|
||||||
|
#include <netdb.h>
|
||||||
|
/* pour les entrées/sorties */
|
||||||
|
#include <stdio.h>
|
||||||
|
/* pour la gestion des erreurs */
|
||||||
|
#include <errno.h>
|
||||||
|
/* fonctions de tsock*/
|
||||||
|
#include "tsock.h"
|
||||||
|
/* pour afficher l'adresse d'un socket */
|
||||||
|
#include <arpa/inet.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 =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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue