2010-10-27 22 views
1

Je dois recevoir un flux de multidiffusion mais filtrer les paquets entrants par adresse MAC source sur CentOS 5.5. Je prévois d'utiliser la bibliothèque libpcap. Est-il possible de joindre/quitter le groupe de multidiffusion en utilisant libpcap? Si oui, comment faire?groupe de multidiffusion join/leave utilisant libpcap

Merci

Répondre

2

Bien sûr, juste construire et envoyer les paquets IGMP appropriés.

+0

Comment faire cela? Quelle API dois-je utiliser? – Dima

+0

La réponse ci-dessus est meilleure que ma suggestion. Mais si vous pouvez relier les adresses MAC source aux adresses IP, vous feriez mieux de le faire * all * dans l'application, pas de libpcap du tout. Il suffit de connecter le socket MC à l'adresse IP de la source, qui filtrera tout le reste. S'il existe plusieurs sources souhaitées, vous pouvez exécuter plusieurs sokcets MC sur le même port. – EJP

+0

Je n'ai pas besoin de recevoir les paquets générés par mon application. J'ai créé le filtre qui passe tous les paquets sauf les paquets qui viennent de ma propre adresse MAC – Dima

1

socket factice 1.Créez: sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

2.Bind il: rc = bind(sd, (sockaddr*) &addr, sizeof(sockaddr_in));

3.Join groupe multicast:

ip_mreq mreq; 
mreq.imr_interface.s_addr = htonl(InterfaceIp); 
mreq.imr_multiaddr.s_addr = htonl(DestIp); 
if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { 
    close(sd); 
    // Error handle... 
} 

Ne pas envoyer ou recevoir des paquets en utilisant la prise factice

4.open pcap utilisant pcap_open_live()

L'idée générale est d'utiliser socket standard afin de "dire" au noyau d'envoyer le paquet de jointure IGMP, et après utiliser pcap afin de capturer les paquets.