Nous avons rencontré un problème épineux. Nous écrivons un programme C++ qui reçoit le trafic UDP multicast. Nous sommes en train de déplacer nos applications vers un environnement réseau différent et notre équipe des opérations nous a demandé de prendre en charge les annonces d'adhésion IGMPv3 de nos applications. Les premières investigations indiquent que les noyaux Linux 2.6 supportent IGMPv3. Par conséquent, je suis perplexe que lorsque nous courons tcpdump, nous voyons les traces de sortie suivantes:Multicast Rejoignez Linux et IGMPv3
[[email protected]]$ sudo /usr/sbin/tcpdump -i eth1.22 igmp
tcpdump: listening on eth1.22
00:20:09.007094 switch-a.stage > ALL-SYSTEMS.MCAST.NET: igmp query v2 [max resp time 20] [ttl 1]
00:20:09.241946 10.129.22.236 > 232.0.1.10: igmp v2 report 232.0.1.10 (DF) [tos 0xc0] [ttl 1]
00:20:10.472159 10.129.22.236 > 236.0.1.101: igmp v2 report 236.0.1.101 (DF) [tos 0xc0] [ttl 1]
44 packets received by filter
Ma compréhension est que l'on pourrait forcer le noyau à utiliser une version inférieure de IGMP en spécifiant une valeur non nulle dans la fichier /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; cependant, j'ai confirmé que le fichier a une configuration de valeur nulle.
Notre application utilise le code suivant pour rejoindre le groupe de multidiffusion:
... joinMulticast(in_addr mcast_addr, in_addr interface_addr)
{
struct ip_mreq mcast_req;
mcast_req.imr_multiaddr.s_addr = mcast_addr;
mcast_req.imr_interface.s_addr = interface_addr;
int err = setsockopt(fFileDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char*)&theMulti, sizeof(theMulti));
// handle errors etc.
// ...
}
Y at-il quelque chose de plus que nous devons inclure dans le programme source pour forcer IGMPv3?
Intéressant. Oui, le réglage de la force à 3 fait que le serveur utilise igmp v3. Par conséquent, je crois que la prochaine étape est de s'assurer que le réseau utilise igmpv3. Merci! – terson