Tutorat_Git/TPReseaux_V2.c
2023-02-16 14:34:44 +01:00

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);
}
}
}
}