261 lines
7.1 KiB
C
261 lines
7.1 KiB
C
/* 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 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 construit : ");
|
|
for (i=0 ; i<lg ; i++) printf("%c", message[i]) ; printf("\n");
|
|
}
|
|
|
|
void Creation_puit_udp(int port,int taille_max_message) {
|
|
//on créer le socket local et on récupère sa représentation interne
|
|
int sock_local = socket(AF_INET,SOCK_DGRAM,0);
|
|
//on créé une adresse puis on lui attribue
|
|
struct sockaddr_in addr_locale;
|
|
addr_locale.sin_family =AF_INET;
|
|
addr_locale.sin_port=htons(port);
|
|
addr_locale.sin_addr.s_addr=INADDR_ANY;
|
|
//attribution de l'@
|
|
bind(sock_local,(struct sockaddr*)&addr_locale,sizeof(addr_locale));
|
|
//reception d'un message
|
|
char* pmesg =malloc(taille_max_message);
|
|
struct sockaddr_in* padr_em = malloc(sizeof(struct sockaddr_in));
|
|
int plg_adr_em = sizeof(struct sockaddr_in);
|
|
while (1) {
|
|
int taillerecuperee =recvfrom(sock_local,pmesg,taille_max_message,0,(struct sockaddr*)padr_em,&plg_adr_em);
|
|
printf("la taille recuperee = %d octets\n",taillerecuperee);
|
|
printf("le message : %s\n", pmesg);
|
|
}
|
|
}
|
|
|
|
void creation_source_udp (int port, char* machine,char* message, int nb_messages) {
|
|
//on créer le socket local et on récupère sa représentation interne
|
|
int sock_local = socket(AF_INET,SOCK_DGRAM,0);
|
|
// on fournit l'adresse destinataire
|
|
struct sockaddr_in addr_distant;
|
|
addr_distant.sin_family =AF_INET;
|
|
addr_distant.sin_port =htons(port);
|
|
struct hostent *hp=gethostbyname(machine);
|
|
memcpy((char*)&(addr_distant.sin_addr.s_addr),hp->h_addr,hp->h_length);
|
|
//emission d'un message
|
|
int i;
|
|
for (i=0;i<nb_messages;i++){
|
|
int tailleenvoyee = sendto(sock_local,message,strlen(message),0,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
|
|
printf("taille = %d\n",tailleenvoyee);}
|
|
|
|
|
|
}
|
|
|
|
void creation_puit_TCP(int port,int taille_max_message,int longueurfile){
|
|
//on créer le socket local et on récupère sa représentation interne
|
|
int sock_local = socket(AF_INET,SOCK_STREAM,0);
|
|
//on créé une adresse puis on lui attribue
|
|
struct sockaddr_in addr_locale;
|
|
addr_locale.sin_family =AF_INET;
|
|
addr_locale.sin_port=htons(port);
|
|
addr_locale.sin_addr.s_addr=INADDR_ANY;
|
|
//attribution de l'@
|
|
bind(sock_local,(struct sockaddr*)&addr_locale,sizeof(addr_locale));
|
|
//etablissement de la connexion
|
|
|
|
//dimensionnement de la file d'attente
|
|
listen(sock_local,longueurfile);
|
|
|
|
//Acceptation des requêtes de connexion
|
|
struct sockaddr_in* padr_em = malloc(sizeof(struct sockaddr_in));
|
|
int plg_adr_em = sizeof(struct sockaddr_in);
|
|
int sockbis;
|
|
sockbis = accept(sock_local,(struct sockaddr*)padr_em,&plg_adr_em);
|
|
|
|
//lire le message reçu
|
|
int i= 0;
|
|
while (1){
|
|
char* pmesg =malloc(taille_max_message);
|
|
|
|
int octetslus =read(sockbis,pmesg,taille_max_message);
|
|
printf("messages lus : %s\n", pmesg);
|
|
printf("nombres octets lus : %d\n", octetslus);
|
|
}
|
|
}
|
|
void creation_source_TCP(int port,char* machine,char*message,int nb_messages){
|
|
//on créer le socket local et on récupère sa représentation interne
|
|
int sock_local = socket(AF_INET,SOCK_STREAM,0);
|
|
// on fournit l'adresse destinataire
|
|
struct sockaddr_in addr_distant;
|
|
addr_distant.sin_family =AF_INET;
|
|
addr_distant.sin_port =htons(port);
|
|
struct hostent *hp=gethostbyname(machine);
|
|
memcpy((char*)&(addr_distant.sin_addr.s_addr),hp->h_addr,hp->h_length);
|
|
//demande de connexion
|
|
int i ;
|
|
if (connect(sock_local,(struct sockaddr*)&addr_distant,sizeof(addr_distant))==0){
|
|
for (i=0;i<nb_messages;i++){
|
|
write(sock_local,message,strlen(message));}
|
|
}
|
|
else{
|
|
printf("échec de la connexion.\n");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void main (int argc, char **argv)
|
|
{
|
|
|
|
int lg = 5;
|
|
char motif ='a';
|
|
char* message =malloc(lg);
|
|
|
|
|
|
|
|
|
|
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 ;
|
|
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) ;
|
|
}
|
|
source = 1;
|
|
break;
|
|
|
|
case 'n':
|
|
nb_message = atoi(optarg);
|
|
break;
|
|
|
|
case 'u':
|
|
UDP = 1;
|
|
|
|
|
|
break;
|
|
|
|
default:
|
|
printf("usage: cmd [-p|-s][-n ##]\n");
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (source == -1) {
|
|
printf("usage: cmd [-p|-s][-n ##]\n");
|
|
exit(1) ;
|
|
}
|
|
//on vérifie si on est dans source ou dans puit
|
|
if (source == 1){
|
|
printf("on est dans la source \n");
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
printf("on est dans le puits\n");
|
|
|
|
|
|
}
|
|
|
|
//gestion du nombre de messages
|
|
|
|
if (nb_message != -1) {
|
|
if (UDP==1){
|
|
printf("mode UDP\n");
|
|
if (source == 1){
|
|
printf("nb de tampons à envoyer : %d\n", nb_message);
|
|
construire_message(message,motif,lg);
|
|
afficher_message(message,lg);
|
|
creation_source_udp (atoi(argv[argc-1]),argv[argc-2] ,message,nb_message);
|
|
}
|
|
else {
|
|
printf("nb de tampons à recevoir : %d\n", nb_message);
|
|
Creation_puit_udp(atoi(argv[argc-1]),100);}
|
|
}
|
|
else{
|
|
printf("mode TCP\n");
|
|
if (source == 1) {
|
|
printf("nb de tampons à envoyer =%d\n",nb_message);
|
|
construire_message(message,motif,lg);
|
|
afficher_message(message,lg);
|
|
creation_source_TCP(atoi(argv[argc-1]),argv[argc-2],message,nb_message);
|
|
|
|
}
|
|
|
|
else{
|
|
printf("nb de tampons à envoyer = infini\n");
|
|
creation_puit_TCP(atoi(argv[argc-1]),100,10);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (UDP==1){
|
|
printf("mode UDP\n");
|
|
if (source == 1) {
|
|
|
|
nb_message = 10 ;
|
|
printf("nb de tampons à envoyer = 10 par défaut\n");
|
|
construire_message(message,motif,lg);
|
|
afficher_message(message,lg);
|
|
creation_source_udp (atoi(argv[argc-1]),argv[argc-2] ,message,nb_message);
|
|
}
|
|
|
|
else {
|
|
printf("nb de tampons à envoyer = infini\n");
|
|
Creation_puit_udp(atoi(argv[argc-1]),100);}
|
|
}
|
|
else{
|
|
printf("mode TCP\n");
|
|
if (source == 1) {
|
|
nb_message = 10;
|
|
printf("nb de tampons à envoyer = 10 par défaut\n");
|
|
construire_message(message,motif,lg);
|
|
afficher_message(message,lg);
|
|
creation_source_TCP(atoi(argv[argc-1]),argv[argc-2],message,nb_message);
|
|
|
|
}
|
|
|
|
else{
|
|
printf("nb de tampons à envoyer = infini\n");
|
|
creation_puit_TCP(atoi(argv[argc-1]),100,10);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|