2011-04-20 3 views
0

J'ai mon programme émetteur/récepteur multicast (udp) opérationnel. Si j'utilise setsockopt pour permettre réalimentation avec l'expéditeur comme ceci:Comment recevoir un message après avoir activé le bouclage?

if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) < 0) 
    error("loopback failed."); 

et plus tard j'envoie le message à tous les abonnés, comment mon expéditeur faire passer le message qui est envoyé? L'expéditeur ne stocke pas sa propre adresse IP et numéro de port et lui-même envoyé un message (en s'abonnant essentiellement à lui-même) le fait?

Il devrait être quelque chose comme:

receiver1 (abonnement) -> émetteur

receiver2 (abonnement) -> émetteur

quand il est temps d'envoyer:

expéditeur (info) -> receiver1

expéditeur (info) -> receiver2

expéditeur (info) -> expéditeur? // Comment fonctionne cette étape?

Merci pour l'aide :)

+0

Vous devez toujours connecter une socket avant de transférer des informations. Sauf si vous utilisez UDP. – ultifinitus

+0

J'utilise UDP. Tout fonctionne sauf que l'expéditeur reçoit son propre message. – matt

+0

Ahhh, ben ça fait plus de sens =) J'avais supposé que tu utilisais TCP, mon mauvais. Je n'ai pas d'expérience dans ce département, seulement le dernier =/ – ultifinitus

Répondre

0

Dans votre code, loop doit être de type u_char, pas int. Bien sûr, cela changera également le paramètre final setsockopt() pour avoir la valeur 1. Je n'ai aucune expérience personnelle de cela, mais W. Richard Stevens le dit dans UNIX Network Programming (3ème édition), Vol. 1, Section 21.6, il doit en être ainsi. Il dit également que l'utilisation du type int est une erreur de programmation courante.

+0

Il est du type u_char. Merci. – matt

+0

Pourquoi est-ce une erreur de programmation commune? Je pense que W. Richard Stevens en est plein; la taille de ces valeurs semble dépendre de l'implémentation. Si je fais un 'getsockopt()' sur 'IP_MULTICAST_LOOP', il me dit qu'il est long de 4 octets (alors que' sizeof (u_char) 'est 1). –

0

En plus d'activer le bouclage (qui peut être activé par défaut, selon http://tldp.org/HOWTO/Multicast-HOWTO-6.html#ss6.1), vous devez également vous abonner au groupe de multidiffusion.

Il n'est pas nécessaire d'envoyer une copie distincte du paquet à chaque récepteur. Si les abonnements multidiffusion sont corrects et que vous êtes sur un réseau qui prend en charge la multidiffusion, une seule transmission est suffisante.

+0

J'ai fini par démarrer un nouveau programme à partir de zéro.Il m'a fallu moins de 6 heures pour le lancer ensemble (je n'ai jamais fait un programme aussi rapide avec autant de nouveau matériel ... vache sainte). J'ai eu un peu de code spaghetti, mais ça a marché! Je vous remercie beaucoup pour votre aide. Vous avez raison d'être activé par défaut, mon professeur voulait s'assurer que nous savions comment l'activer. Encore merci – matt

Questions connexes