2010-09-24 25 views
4

Je suis en train de recevoir des données de multidiffusion à partir de l'interface de réseau spécifique sur CentOS 5,5reçoivent multicast de l'interface de réseau spécifique sur Linux

sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
memset(&addr, 0, sizeof(addr)); 
addr.sin_family = AF_INET; 
addr.sin_port = htons(1234); 
addr.sin_addr.s_addr = htonl(INADDR_ANY); 
bind(sd, (sockaddr*)&addr, sizeof(sockaddr_in)); 
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 5); 

Mais je reçois des paquets de toutes les interfaces.

Quel mal?

+0

Si ce pas 'setsockopt (sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);'? (remarquez le 4 vs 5). –

+0

J'ai essayé setsockopt (sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4), mais le setsockopt() a échoué. Je pense (pas sûr) que 5 inclut la fin zéro. – Dima

Répondre

5

Tout d'abord, vérifiez si l'un de vos appels échouent, socket, bind, setsockopt dans ce cas. L'impression d'un message d'erreur avec la fonction perror() vous aidera à diagnostiquer les problèmes.

Cependant, pour recevoir des datagrammes multicast vous pourriez avoir besoin de spécifier l'adresse IP de l'interface lorsque vous rejoignez un groupe de multidiffusion en utilisant l'option prise IP_ADD_MEMBERSHIP Quelque chose comme

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

où le struct mreq est

struct ip_mreq 
{ 
     struct in_addr imr_multiaddr; /* IP multicast address of group */ 
     struct in_addr imr_interface; /* local IP address of interface */ 
}; 

Plus d'info here.

+0

J'ai changé ADD_MEMBERSHIP en fonction de vous. Le résultat est le même: je reçois toujours des multidiffusions provenant d'autres interfaces. BTW, dans mon code réel, je vérifie les valeurs de retour de toutes les API. Merci, Dima – Dima

+0

C'était mon erreur, votre solution fonctionne! Merci, Dima – Dima