multicast et linux - C - Programmation
Marsh Posté le 18-06-2013 à 16:07:55
Bonjour ! Avez-vous défini une route pour le multicast ?
Code :
|
Si oui, il ne doit pas être nécessaire de dire quelle interface utiliser dans le programme, dans le cas contraire, il parait logique d'indiquer au système sur quelle interface réseau (eth0, lo) envoyer les trames.
De mémoire, sous Windows il n'est pas nécessaire d'ajouter cette route pour que cela marche (est-elle ajoutée automatiquement ?), ce qui explique la différence de fonctionnement, que j'ai en effet souvent remarquée entre les deux OS.
Bonne continuation !
PS : Avec la gestion des routes, vous pouvez diriger finement vos trames multicast vers l'une ou l'autre de vos interfaces, en faisant varier l'IP et le masque.
Marsh Posté le 18-06-2013 à 16:14:58
super, c'est exactement ca le probleme.
Sous windows, les routes multicast sont définies pour toutes les interfaces par défaut, donc si je fais un send sous windows, il envoie mon paquet sur toutes les interfaces.
Sous linux, par défaut, aucune route n'est définie, donc si je ne précise pas l'interface, il ne sait pas où aller ( même si je n'ai qu'une interface réseau ). En ajoutant la route comme tu le précises, cela fonctionne.
Je viens de tester, ca marche. Merci pour l'info.
Marsh Posté le 18-06-2013 à 16:18:08
J'en profite pour glisser une info supplémentaire, sur la réception cette fois-ci.
Le setsockopt ( ... IP_ADD_MEMBERSHIP ... ) doit se faire AVANT le bind sous linux, alors que sous windows , il faut le faire APRES le bind.
Je n'ai pas d'explication à propos de cette différence d'implémentation.
next step : ios
Marsh Posté le 18-06-2013 à 16:59:33
xilebo a écrit : ... ( même si je n'ai qu'une interface réseau ) ... |
Justement, il y a deux interfaces sous Linux : "eth0" et la boucle locale "lo", d'où, sans doute, la confusion du système (je n'ai jamais essayé d'en désactiver une voir si cela marchait sur la seule restante).
Marsh Posté le 18-06-2013 à 15:49:14
Bonjour,
J'ai un petit souci lors d'envoi de trame multicast sous linux. Voici un code exemple pour illustrer le problème :
si je commente les lignes
mon sendto renvoie une erreur. On va dire que c'est normal, je ne peux pas envoyer en multicast sur une socket, si je ne lui ai pas précisé préalablement qu'elle doit fonctionner en multicast.
Si maintenant je remplace ces mêmes lignes par :
setsockopt ne me retourne pas d'erreur ( donc on peut suppose que ca s'est bien passé ) , par contre mon sendto me renvoie également une erreur ( network unreachable me semble-t-il ).
Si maintenant je mets
Comme dans le code exemple, ici 172.17.17.17 étant l'adresse IP de l'interface sur laquelle je veux dialoguer ( eth0 ) , mon sendto fonctionne bien et je vois bien le paquet UDP partir avec wireshark.
Ma question est : pourquoi cela ne marche pas si je fais un setsockopt sur INADDR_ANY, y a-t-il une option supplémentaire pour autoriser ce genre de chose ?
Je précise que sous windows, ce code fonctionne bien, et c'est un besoin que j'ai car je ne connais pas forcément l'adresse IP de l'interface sur laquelle je veux dialoguer.
Merci d'avance