I. Introduction  

IP possède trois types fondamentaux d’adresses : unicast, broadcast et multicast. Une adresse unicast est utilisée pour envoyer un paquet vers une destination unique. Une adresse de diffusion est utilisée pour envoyer un datagramme à l’ensemble d’un sous-réseau. Une adresse multicast permet d’envoyer un datagramme à un ensemble d’hôtes qui peuvent être sur différents sous-réseaux et qui sont configurés en tant que membres d’un groupe multicast.


Diffusion = Plusieurs récepteurs pour une seule émission d'un paquet

 

La diffusion est disponible de deux façons différentes :

1.    diffusion intĂ©grale (broadcasting) : dans laquelle la diffusion s’effectue en direction de toutes les machines d’un rĂ©seau donnĂ©.

2.    multidiffusion ou diffusion de groupe (multicasting) : envoi de donnĂ©es Ă  un sous-groupe de tous les Ă©lĂ©ments d'un rĂ©seau.

·                   un groupe identifie un service de diffusion

·                   lorsqu’un message est Ă©mis Ă  destination d’un groupe, tous les membres peuvent recevoir un exemplaire du message.

·                    pour recevoir il faut ĂŞtre membre du groupe.

·                   pour envoyer cela n’est pas nĂ©cessaire.

adresse IP multicast :

1.    Une adresse IP multicast n'identifie pas une machine sur un rĂ©seau mais un groupe multicast.

2.    Classe d'adresse IP entre 224.0.0.0 et 239.255.255.255 (Classe D).

3.    Adresses entre 225.0.0.0 et 238.255.255.255 sont utilisables par un programme quelconque.

4.    Les autres sont rĂ©servĂ©es.

 

II. Configuration

Pour utiliser le multicast en C, on doit passer par la configuration des sockets (couche IP)

1. Lire l'état d'une option : getsockopt

int getsockopt(int sock, int niveau, int option, void *valeur, socklen_t *longueur)

 

2. Modifier l'état d'une option : setsockopt

int setsockopt(int sock, int niveau, int option, void *valeur, socklen_t longeur)

 

Paramètres d’entrées :

1.    sock : la socket que l'on veut gĂ©rer

2.    niveau : le niveau du protocole choisi, valeurs entre autres parmi

SOL_SOCKET : la socket elle-mĂŞme, IPPROTO_IP : la couche IP, IPPROTO_TCP : la couche TCP, IPPROTO_UDP : la couche UDP

3.    option : option choisie

 

Notamment pour le niveau SOL_SOCKET :

·                           SO_BROADCAST : autorisation de diffusion des paquets, ,

·                           SO_REUSEADDR : autorise de lier plusieurs sockets au mĂŞme port

·                           SO_TYPE (avec get) : retourne le type de la socket (SOCK_DGRAM ...)

Notamment pour le niveau IP_PROTO :

·       IP_[ADD/DROP]_MEMBERSHIP : inscription ou dĂ©sinscription d'un groupe multicast,

·       IP_MULTICAST_LOOP : paquet diffusĂ© est reçu ou pas Ă  son Ă©metteur,

·       IP_MULTICAST_TTL : TTL d'un paquet envoyĂ© en multicast Programmation RĂ©seaux 19 Avril 2015

 

4.     valeur : donnĂ©es dĂ©crivant l'Ă©tat de l'option. En gĂ©nĂ©ral, on utilise un entier ayant pour valeur 0 ou 1.

·       0 : l'option n'est pas positionnĂ©e 1 : l'option est positionnĂ©e.

5.    longueur : longueur du champ valeur.

 

II.1. Description du groupe multicast :

Pour décrire le groupe multicast on utilise la structure ip_mreq

struct ip_mreq

     { struct in_addr imr_multiaddr;

       struct in_addr imr_interface;

     };

•    imr_multiaddr : adresse IP multicast

•    imr_interfcae : adresse IP locale ou interface locale (On utilisera par dĂ©faut INADDR_ANY)

 

II.2. Réalisation de broadcast en C

pour faire de la diffusion (broadcast)

1. Créer la socket UDP de manière normale.

Int sock = socket(AF_INET, SOCK_DGRAM, 0);

 

2. appliquer l'option SO_ BROADCAST

int autorisation=1 ;

setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &autorisation, sizeof(int));

·       On diffuse les paquets en utilisant l'adresse de diffusion du rĂ©seau

·       Toutes les machines connectĂ©es au rĂ©seau recevront ce paquet

 

II.3. Réalisation de multicast en C

Pour initialiser une socket UDP en mode multicast , on doit respecter les étapes suivantes :

1. Créer la socket UDP de manière normale.

int sock = socket(AF_INET, SOCK_DGRAM, 0)

 

2. Créer l'objet ip_mreq

 

// récupération adresse ip du groupe

struct in_addr ip;

inet_aton("224.1.2.3", &ip);

// création identificateur du groupe

ip_mreq group ;

group.imr_multiaddr.s_addr = ip.s_addr;

gr_multicast.imr_interface.s_addr = INADDR_ANY;

3. Associer cet objet ip_mreq Ă  la socket avec l'option IP_ADD_MEMBERSHIP Abonnement au groupe multicast

 

setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(struct ip_mreq));

 

4. Eventuellement appliquer l'option SO_REUSEADDR pour lier plusieurs sockets sur le port utilisé par cette socket, c'est-à-dire sur le port du groupe multicast, Sinon on ne peut pas avoir deux 2 programmes utilisant le même groupe multicast sur la même machine à cause du bind réalisé

int reuse = 1;

setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

 

5. Lier la socket au numéro de port du groupe multicast

// liaison de la socket au port du groupe multicast

struct sockaddr_in ad_multicast ;

bzero((char *) &adresse, sizeof(adresse));

ad_multicast.sin_family = AF_INET;

ad_multicast.sin_addr.s_addr = htons(INADDR_ANY);

ad_multicast.sin_port = htons(1234);

bind(sock, & ad_multicast, sizeof(struct sockaddr_in));

//Emission d'un paquet On utilise le couple @IP du groupe/port du groupe

struct sockaddr_in adresse;

int longueur_adresse = sizeof(struct sockaddr_in);

bzero((char *) &adresse, sizeof(adresse));

adresse.sin_family = AF_INET;

adresse.sin_addr.s_addr = ip.s_addr;

adresse.sin_port = htons(1234);

sendto(sock, message, tailleMessage , 0, (struct sockaddr*)&adresse, longueur_adresse);

// réception d'un paquet : avec recvfrom ou peut utiliser // aussi recv car ne recevra des paquets que venant du groupe

recv(sock, buffer, TAILLEBUFFER, 0);

 


Modifié le: samedi 18 mai 2024, 22:21