Le TP de Réseaux
This commit is contained in:
parent
4264b1bd09
commit
16fe1f4268
1 changed files with 261 additions and 0 deletions
261
TPReseaux_V2.c
Normal file
261
TPReseaux_V2.c
Normal file
|
@ -0,0 +1,261 @@
|
|||
/* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in a new issue