Bonjour,
J'essaie de manipuler les datagrammes en multicast avec Mono. J'arrive tranquillement à faire ce que je veux sur les Mac, les PC.
Mais dès lors que j'utilise une machine en Wifi (comme un iPad, ou un PC portable) :
- J'arrive à envoyer mes datagrammes (les autres machines le voient)
- Edit : Non. l'iPad peut, pas le PC Portable
- Je n'en reçois aucun (des autres machines)
Si je branche le PC Portable sur Ethernet (et que je relances le programme) plus de soucis tout va bien. Le wifi et Ethernet sont sur le même réseau.
Une idée ?
J'ai pu voir que certains routeurs ne laissent pas passer les données multicast en wifi, mais comme je l'ai dit, je les envoie bien : je n'arrive juste pas à les recevoir.. un problème de routeur ?
Quelqu'un sait si les iPads ont leur propre parefeu ?
Edit : du code. (Mais je ne pense pas que le soucis vienne de là)
La 'connection' (rejoindre le groupe)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public bool JoinGroup(string groupIP, int groupPort) { try { if (UDP != null) throw new UnityException("Already started"); // Huhu, grillé this.UDP = new UdpClient(); this.UDP.ExclusiveAddressUse = false; this.UDP.Client.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); // Pas sûr que ce soit nécessaire ce doublon.. this.UDP.ExclusiveAddressUse = false; this.UDP.Client.Bind(new IPEndPoint(IPAddress.Any, groupPort)); IPAddress parsedGroupAddress = IPAddress.Parse(groupIP); this.Group = new IPEndPoint(parsedGroupAddress, groupPort); this.UDP.JoinMulticastGroup(parsedGroupAddress, TTL); // TTL : constant (20~50) //UDP.MulticastLoopback = true; this.UDP.MulticastLoopback = false; GUILog.Add("Group joined", Color.green); } catch (System.Exception e) { this.UDP = null; GUILog.Add("Error: " + e.Message, Color.red); } return (this.UDP != null); } |
Envoi et reception :
1 2 3 4 5 6 | // Envoi (appelé en boucle pour tester) this.UDP.Send(bytes, bytes.Length, this.Group); // Reception (appelée en boucle) this.LastReceivePoint = new IPEndPoint(this.Group.Address, this.Group.Port); this.data = this.UDP.Receive(ref this.LastReceivePoint); |