J'ai le code suivant pour lire un message de multidiffusion provenant du réseau, pour un port IP + spécifié
private static void SendManuallyOnAllCards(int port, string multicastAddress, IEnumerable<IPAddress> ipAddresses) { foreach (IPAddress remoteAddress in ipAddresses) { IPAddress ipToUse = remoteAddress; using (var mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(multicastAddress))); mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255); mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); var ipep = new IPEndPoint(ipToUse, port); //IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(multicastAddress), port); mSendSocket.Bind(ipep); mSendSocket.Connect(ipep); byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message"); mSendSocket.Send(bytes, bytes.Length, SocketFlags.None); } } }
3 Réponses :
Vous devez rejoindre le groupe de multidiffusion via toutes les interfaces disponibles. Par défaut, le message de jointure IGMP sortant sera acheminé en fonction des tables de routage Unicast, qui l'enverront via l'itinéraire «Prix le moins cher», à l'aide de la carte réseau d'accès à cette route. Si votre groupe de multidiffusion peut être acheté via plusieurs de ces itinéraires, vous devez itérer. P>
Je ne sais pas de comprendre, le mudpClientReceiver.joinMulticastgroup (ipaddress.parse (IP), 255); code> qui est fait pour tous les udpclient le font, non? Si non, comment devrais-je faire cela?
Vous devez parcourir les adresses IP des interfaces locales et vous joindre à chacun d'entre eux.
Je pense que vous n'avez pas vu ma deuxième citation de code, c'est exactement ce que je fais.
@ J4n sors ça. C'est exactement ce que vous êtes maintenant i> faire, dans le code de votre réponse, qui a été posté plusieurs heures après que j'ai posté ceci. La clé est de itérer sur les adresses IP locales et d'utiliser le formulaire de joinMulticastGroup () qui prend une adresse locale. Vous n'étiez pas et ne le faites pas, faites cela dans le code de votre question, ce que je réponds.
Vérifiez mon deuxième code Modifier, je suis déjà itération sur tous mes IP locaux. La différence est que maintenant j'utilise les méthodes asynchronisées
@ J4N Non, la différence est que vous faites maintenant ce que je vous ai dit de faire en premier lieu, rejoindre le groupe de multidiffusion via toutes les adresses de toutes les interfaces locales, i> en utilisant le formulaire de joinmulticastgroup () J'ai mentionné ci-dessus, qui prend une adresse locale comme un argument. I> Il n'y a pas d'autre moyen de le faire. Votre deuxième morceau de code ne fait pas cela et ne constitue donc pas déjà ce que j'ai dit. L'utilisation de l'ASYNC API n'a rien à voir avec cela. Vous ne pouvez pas croire sérieusement que la multidiffusion multi-hébergée ne fonctionnait pas tant que l'API ASYNC est arrivée. Je le faisais il y a dix ans.
J'ai enfin trouvé comment le faire!
En fait, si je garde exactement le même code, mais en l'utilisant avec des méthodes asynchrones, ça marche !!! Je ne peux tout simplement pas comprendre pourquoi cela ne fonctionne pas avec la méthode de synchronisation (si quelqu'un le sait, vous êtes invité à me dire :)) P>
Comme j'ai perdu 3 jours à ce sujet, je pense que ça Vaut un exemple: p> et la méthode ASYNC: p> J'espère que cela aide;) P> < / p>
J'ai eu le même problème que je voulais recevoir des multidits de toutes mes interfaces réseau. Comme EJP l'a déjà dit, vous devez appeler joinMulticastgroup (ipaddress multicasttaddr, ipaddress localaddress) code> sur l'UDPCLIPT pour toutes les interfaces réseau:
int port = 1036;
IPAddress multicastAddress = IPAddress.Parse("239.192.1.12");
client = new UdpClient(new IPEndPoint(IPAddress.Any, port));
// list of UdpClients to send multicasts
List<UdpClient> sendClients = new List<UdpClient>();
// join multicast group on all available network interfaces
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface networkInterface in networkInterfaces)
{
if ((!networkInterface.Supports(NetworkInterfaceComponent.IPv4)) ||
(networkInterface.OperationalStatus != OperationalStatus.Up))
{
continue;
}
IPInterfaceProperties adapterProperties = networkInterface.GetIPProperties();
UnicastIPAddressInformationCollection unicastIPAddresses = adapterProperties.UnicastAddresses;
IPAddress ipAddress = null;
foreach (UnicastIPAddressInformation unicastIPAddress in unicastIPAddresses)
{
if (unicastIPAddress.Address.AddressFamily != AddressFamily.InterNetwork)
{
continue;
}
ipAddress = unicastIPAddress.Address;
break;
}
if (ipAddress == null)
{
continue;
}
client.JoinMulticastGroup(multicastAddress, ipAddress);
UdpClient sendClient = new UdpClient(new IPEndPoint(ipAddress, port));
sendClients.Add(sendClient);
}
Thnks, j'ai trouvé cela utile
Quelles sont vos interfaces (Ethernet, Eth / WLAN)? Et quelle adresse IP avez-vous sur ces interfaces? Il serait plus utile que vous puissiez analyser comment vous envoyez votre message de multidiffusion.
@PCoder: Merci pour votre commentaire, j'ai ajouté des détails sur ma question initiale (éditer 4)
Et pouvez-vous nous montrer la sortie de votre commande code> itinéraire code>?
@PCoder: tout ce qui pourrait aider, je suis vraiment désespéré ici (et je ne suis pas un expert en réseau :(). J'ai édité la question avec le résultat
Je conviens que votre problème est vraiment délicat, et je n'ai pas non plus de solution :(. J'ai trouvé un problème très similaire à la vôtre, peut-être que cela peut être utile. http://linux.derkeiler.com/newsgroups/comp.os.linux.networki ng / 2009-09 / msg00223 . HTML
@PCoder: Merci pour l'aide de toute façon. Je pense que l'équivalent C # est le socketOption
socketoptionname.multicastinterface code>, mais cela n'a rien changé