Abonnement a une adresse ip multicast

Fermé
sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007 - 25 avril 2007 à 18:20
sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007 - 27 avril 2007 à 12:56
Bonjour,
Je suis tout nouveau dans le domaine des reseaux.
j'ai developpé une application client /serveur .
le serveur emet des message sur une adresse ip multicast ( 224.1.1.1) .
le client recupere ces données depuis cette adresse egalement.
tout ce passe bien , je suis content.
la deuxieme etape consiste a faire la meme chose mais entre deux PC ( client et serveur) distant , le client dans un lan , et le serveur dans un autre lan.
entre les 2 ; ya un routeur cisco connecté directement au client.
merci de me donner une idée pour que le client puisse "s'abonner" a l'adresse ip multicast a travers le routeur ( ... cest pas très clair, j'ai du mal a mexprimer , je peux vous donner plus d'info afin de mieu clarifier si besoin )
merci d'avance

1 réponse

brupala Messages postés 110830 Date d'inscription lundi 16 juillet 2001 Statut Membre Dernière intervention 20 janvier 2025 13 895
25 avril 2007 à 18:35
salut,
les routeurs bloquent naturellement les broadcast et les multicast .
il est possible de configurer des protocoles d'échange de groupes multicast par exemple via PIM: http://www.cisco.com/en/US/products/sw/iosswrel/ps1835/products_configuration_guide_chapter09186a00800ca794.html
1
sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007 1
26 avril 2007 à 10:51
bonjour brupala,
merci de ta reponse.
je ne pense pas que çà vient du routeur car j ai deja essayé un exemple de client serveur qui foncionne de la meme facon ( serveur emet sur ip multicast une projection en power point et le client recoit bien la projection ..)
mon encadrant ma dit quil faut voir dans le code du protocole udp si ya moyen de créer un tunel a travers ce routeur
0
brupala Messages postés 110830 Date d'inscription lundi 16 juillet 2001 Statut Membre Dernière intervention 20 janvier 2025 13 895 > sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007
27 avril 2007 à 09:45
le code du protocole udp ? là je ne vois pas .
0
sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007 1 > sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007
27 avril 2007 à 10:05
#include "serveur.h"

/* constantes */
#define MAXBUFFER 256 /* taille maximum du tampon */
#define PORTDEFAUT 1000 /* port utilisé par defaut*/
#define GROUPE "224.1.1.1" /* adresse du groupe par defaut */
#define NOMBREMOTS 6 /* nombre max de mots qui peuvent être entrés pour trier */


/* fonction principale */
int main(int argc, char *argv[]) {

/* variables */
struct sockaddr_in srv, cli; /*structure qui contiendra les adresses du serveur et du client */
struct ip_mreq mreq; /* structure de stockage des informations relative au groupe multicast */
int compteur;
int statut;
int triage;
char *pointeur;
char *separateur = { " " }; /* Le séparateur de mot */
char *buffer;
char trier[100];
int nb_mot = 1;
int ip = 0;
char *mots[5];
int s, n, r;
char buf[MAXBUFFER]; /* variable qui contiendra le message */
int reuse = 1;
int po = 0;
unsigned short port = PORTDEFAUT;
char adresse[16];

memset(&srv, 0, sizeof(srv)); /* zero pour le reste de struct */
srv.sin_family = AF_INET; /* famille d'adresse */
srv.sin_port = htons(PORTDEFAUT); /* le port par defaut va être utilisé */
strncpy ( adresse, GROUPE, sizeof ( adresse ) );

printf ("Entrez %d mots maximum à rechercher (ne rien mettre pour afficher tous les messages):\n", NOMBREMOTS); /* demande l'entrée de mots avec lesquels on va trier les messages */
fgets(trier, 95, stdin); /* saisie de la phrase */
if (strcmp(trier, "")!=0) /* on teste si des mots ont été entrés */
{
int len;
triage = 1; /* le triage sera effectué */
compteur = 0;
while ( trier[compteur] != '\0' && compteur != 100) /* cherche la fin de la chaine trier */
{
compteur++;
}
compteur--;
/* on insert un dernier mot fictif "aqw" car la recherche des mots ne fonctionne pas sur le dernier mot */
trier[compteur] = ' ';
trier[compteur + 1] = 'a';
trier[compteur + 2] = 'q';
trier[compteur + 3] = 'w';
trier[compteur + 4] = '\0';
len = strlen (trier )+1;
buffer = malloc ( len );
if ( buffer )
{
strncpy ( buffer, trier, len );
pointeur = strtok( buffer, separateur ); /* decoupage du premier mot */
mots[nb_mot-1]=pointeur; /* on place le premier mot dans le tableau "mots" */
while( pointeur != NULL && nb_mot < NOMBREMOTS)
{
pointeur = strtok( NULL, separateur ); /* decoupage des autres mots */
mots[nb_mot]= pointeur; /* on place les autres mots dans le tableau */
if ( pointeur != NULL && nb_mot <= ( NOMBREMOTS - 1 ))
{
nb_mot++; /* increment du nombre de mot */
}
}
}
}
else
{
triage = 0; /* aucun triage ne sera effectué */
}
system("cls"); /* efface l'ecran */ /* remplacer par : system ("cls"); pour une compilation windows */
////////////////////////////////////////////////////////////////////////////////////////////////////////

srv.sin_port = htons(port); /* redefinition du port utilisé avec le port entré en ligne de commande */
SocketInit();
srv.sin_addr.s_addr=htons(INADDR_ANY);
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { /* mise en place du socket */
perror("erreur sur le socket"); /* gestion d'erreur sur le socket */
return 1;
}
r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse)); /* permet plusieurs client sur un meme poste */
if (r == -1)
{
printf("erreur sur le setsockopt");/* gestion d'erreur */
return 1;
}
if (bind(s, (struct sockaddr *)&srv, sizeof(srv)) < 0) /* definition du port */
{
printf("erreur sur le bind"); /* gestion d'erreur sur la definition du port */
return 1;
}


mreq.imr_multiaddr.s_addr = inet_addr ( adresse ); /* gestion d'erreur sur la conversion d'adresse */
mreq.imr_interface.s_addr = htonl(INADDR_ANY); /* le client peut recevoir des messages de n'importe qui */
if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) /* demande l'appartenance au groupe multicast */
{
perror("setsockopt"); /* gestion d'erreur sur la demande d'appartenance au groupe */
return 1;
}
n = sizeof(cli);

while (1) /* boucle infinie pour recevoir un nombre illimité de messages */
{
if ((r = recvfrom(s, buf, MAXBUFFER, 0, (struct sockaddr *) &cli, (unsigned*)&n)) < 0) /* reception du message */
{
perror("erreur sur le recvfrom"); /*gestion d'erreur sur la reception */
}
else
{
char temp[MAXBUFFER];
int indice = 0;
strncpy (temp, buf, sizeof ( temp ) );
while ( temp[indice] != '\0' )
{
if ( isprint( temp[indice] ) == 0 ) /* on teste si le caractère est imprimable ou non */
{
temp[indice] = '&'; /* on remplace les caractères non imprimables par un '&' */
}
indice++; /* on incrémente le compteur */
}
if ( triage == 1 ) /* on teste si il y a un triage a faire */
{
compteur = 0;
statut = 1;
while ( compteur < nb_mot && statut == 1 )
{
strncpy( temp, buf, sizeof ( temp ) );
if (strstr(temp, mots[compteur])!=0 ) /* recherche du mot dans la chaine reçue */
{
statut = 1; /* le mot est trouvé */
}
else
{
char dernier[20];
int compte = 0;
strncpy(dernier, mots[compteur], sizeof ( dernier ) ); /* on copie le mot dans dernier */
while ( dernier[compte] != '\0' && compte != 20) /* cherche la fin de la chaine trier */
{
compte++; /* on incrémente le compteur */
}
if (dernier[compte-1] == 'w' && dernier[compte-2] == 'q' && dernier[compte-3] == 'a') /* on teste si les trois derniers caractères sont 'a' 'q' et 'w' */
{
statut = 1; /* c'est le mot de fin ("aqw") donc tous les mots sont trouvés */
}
else
{
statut = 0; /* le mot n'est pas trouvé */
}
}
compteur++; /* on incémente le compteur */
}
if ( statut == 1 ) /* on teste si tous les mots ont été trouvés */
{
buf[r] = 0;
fprintf(stdout, "Message envoyé par %s : %s\n",inet_ntoa(cli.sin_addr), buf); /* affichage du message car tous les mots ont été trouvés */
statut = 0;
}
}
if ( triage == 0 ) /* on teste si il y a un triage */
{
buf[r] = 0;
fprintf(stdout, "Message envoyé par %s : %s",inet_ntoa(cli.sin_addr), buf); /* pas de triage donc on affiche tous les messages */

}
}
}
if ( buffer )
{
free ( buffer );
}


return( EXIT_SUCCESS) ;
}




#include "client.h"

/* constantes */
#define MAXBUFFER 256 /* tampon */
#define PORT 1000 /* port utilisé par defaut */
#define GROUPE "224.1.1.1" /* GROUPE du groupe par defaut */

void help();

/* instructions */
int main( int argc , char *argv[] )
{
int ip = 0;
int po = 0;
int soc; /* nom du socket */
struct sockaddr_in srv; /* structure qui contiendra l'GROUPE et le port */
char buf[MAXBUFFER]; /* variable qui coniendra le message */

memset(&srv, 0, sizeof(srv)); /* zero pour le reste de struct */
srv.sin_family = AF_INET; /* famille d'GROUPE */
srv.sin_port = htons(PORT); /* redefinition du port avec le port entré en argument */
srv.sin_addr.s_addr = inet_addr ( GROUPE );
SocketInit();

if ( ( soc = socket ( AF_INET, SOCK_DGRAM, 0 ) ) < 0 ) /* mise en place du socket */
{
perror( "erreur sur le socket" ); /* gestion de l'erreur sur le socket */
return 1;
}
while ( fgets ( buf, MAXBUFFER, stdin ) ) /* attend l'entrée d'une chaine de caractères par l'utilisateur pour continuer */
{
if ( sendto ( soc, buf, sizeof ( buf ), 0, ( struct sockaddr * ) &srv, sizeof ( srv ) ) < 0 ) /* envoi du message */
{
perror("erreur sur le sendto"); /* gestion de l'erreur sur l'envoi du message */
return 1;
}
else
{
fprintf(stdout, "Message envoyé à %s : %s ",GROUPE, buf); /* affiche que le message est envoyé */
}
}
return( EXIT_SUCCESS) ;
}





NB : j'ai trouvé dans un forum que meme pour le client il faut faire un bind ...
je suis en train de refaire un autre exemple

merci
0
brupala Messages postés 110830 Date d'inscription lundi 16 juillet 2001 Statut Membre Dernière intervention 20 janvier 2025 13 895 > sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007
27 avril 2007 à 10:33
moi je veux bien,
mais tu dis que ça fonctionne dans un réseau local et pas a travers un routeur , il faut donc adapter la configuration du routeur .
tu es sûr que l'autre application passe bien en multicast à travers le routeur ? sur le m^me groupe que toi ?
pour faire un tunnel, il faut 2 extrémités, donc choisir ta destination, ça n'est plus vraiment la philosophie du multicast .
0
sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007 1 > sofiane75016 Messages postés 7 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 18 juin 2007
27 avril 2007 à 12:56
Bizarre!! oui je suis sur de moi, jai fait passé un autre exemple que j'ai chopé que microsoft ( mppt.exe )
et sur cette histoire de bind dans le code du client ? çà te parrait logique ?
0