1

J'écris une application de multidiffusion simple. J'ai l'intention de l'exécuter sur localhost.adresse IP multicast - bloqué dans l'appel à recvfrom

je l'ai fait ce qui suit:

char *maddr; 
. 
. 
. 
sendfd = socket(...); 

struct sockaddr_in sasend; 
sasend.sin_family = AF_INET; 
sasend.sin_port = htonl(portno); 
inet_ntop(maddr, &(sasend.sin_addr.s_addr)); 


struct sockaddr_in sarecv; 
memcpy(&sarecv, &sasend); 

recvfd = socket(...); 

const int on = 1; 
setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); // can you explain why 
                   // this is needed 

bind(recvfd, &sarecv); 

struct ip_mreq mreq; 
memcpy(&mreq.imr_multiaddr, &(sasend.sin_addr)); 
mreq.imr_interface = htonl(INADDR_ANY); 

setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 

char flag = 1; 
setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &flag, 1); 

if (fork() == 0) { 
    while (recvfrom(recvfd)) { 
    } 
} 
else { 
    while (sendto(sendfd)) { 
    sleep(3); 
    } 
} 

dans le code réel je vérifie les valeurs de retour de tous les appels système. le problème est que recvfrom ne retourne pas. le processus reste bloqué dans l'appel à recvfrom.

J'ai essayé d'exécuter deux instances du programme sur des coques différentes. ça n'aide pas.

J'ai également essayé de placer l'indicateur de bouclage à 0, cela n'aide pas.

Je veux exécuter les deux programmes de localhost. L'adresse de diffusion groupée que j'utilise est 239.255.1.2 que j'ai vu du livre

Je pense que nous pouvons utiliser n'importe quelle adresse de classe D lorsque nous faisons l'appel setsockopt requis.

connexion sur le port 1025

en cours d'exécution du noyau 2.6.25

linux

aussi comment puis-je vérifier si le support a été compilé multicasting dans le noyau.

Mise à jour:

i ajouter a la route -net 224.0.0.0 240.0.0.0 dev netmask eth0 sur la coquille. toujours le problème existe.

+0

est la question trop descriptive? –

Répondre

1

ok j'ai désactivé le pare-feu et j'ai pu faire fonctionner le programme. a obtenu l'aide de here

maintenant plus de problèmes:

  • comment ajouter des règles pour le pare-feu pour obtenir spécifiquement mon code à exécuter
  • si je ne désactivez pas réalimentation, alors je ne veux pas les messages de un autre processus envoyant sur le même groupe de multidiffusion, et si je l'active, mon processus reçoit les messages qu'il transmet. C'est parce que je cours les deux programmes sur localhost. est-il un moyen de contourner.