Je ne reçois aucun datagramme en wifi

a marqué ce sujet comme résolu.

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);
+0 -0

Solution, pour le coup : utiliser le broadcast (pour le moment, en fait, ça ne me dérange pas tant que ça.. même si ça ne répond pas à la question.. Je laisse le topic en suspens et non résolu, si vous avez une idée)

 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
38
39
public bool JoinBroadcast(int port)
{
  try
  {
      if (this.HasJoined)
          throw new UnityException("Already joined");

      this.broadcasting = true; // dans JoinGroup : mis à false

      this.UDP = new UdpClient();

      this.UDP.ExclusiveAddressUse = false;

      this.UDP.Client.SetSocketOption(
          SocketOptionLevel.Socket, 
          SocketOptionName.ReuseAddress, true);

      this.UDP.ExclusiveAddressUse = false;

      this.UDP.Client.Bind(new IPEndPoint(IPAddress.Any, port));
#if VERBOSE
      GUILog.Add("UDP Port opened", Color.green);
#endif
      this.GroupAddress = IPAddress.Broadcast;
      this.Group = new IPEndPoint(this.GroupAddress, port);

      this.UDP.EnableBroadcast = true;
#if VERBOSE
      GUILog.Add("Broadcast joined", Color.green);
#endif
  }
  catch (System.Exception e)
  {
      UDP = null;
      GUILog.Add("Error: " + e.Message, Color.red);
  }

  return this.HasJoined;
}

+0 -0

J'ai l'impression que ton routeur Wifi jette silencieusement les paquets que tu envoies sur le réseau local, sauf ceux en broadcast. Ce serait possible ?

Dans le setup où tu envoies les paquets mais que tu ne reçois pas de réponse, est-ce que la machine destinataire reçoit bien les datagrammes ?

+0 -0

Les autres machines sont en filaire, ou en Wifi ?

Étant donné que c'est de l'UDP, il n'y a pas de notion de connexion. Autrement, j'aurais pensé à un truc du style « le routeur bloque parce qu'aucune connexion n'est ouverte, il ne la voit pas » mais ça ne tient pas ici. Tu observes ce comportement avec d'autres applications qui utilisent UDP ? (Typiquement des jeux vidéos en réseau local)

+0 -0

Je ne connais pas beaucoup de jeux qui utilisent le multicast (je suppose qu'ils pourraient l'utiliser pour détecter les machines présentes dans le réseau local.. ce que j'essaie de faire, en fait (refaire une sorte de SSDP, en fait))

J'ai essayé les différents cas possibles : deux PC en filaire, un iPad en wifi et un portable en wifi.

Si la question était de savoir si les appareils étaient du coup dans des réseaux différents (un pour le wifi, l'autre pour le filaire), non : ce n'est pas ça..


Arf, désolé, j'avais mal compris.. ..je ne sais pas quels jeux/applis font ça et si je les ai sous la main pour tester :/

+0 -0

Lance un wireshark sur ton pc portable, tu filtres la sortie avec ton port d'émission/réception du datagrame (ipproto.port ou un truc comme ça), et tu vois si c'est pas ton appli qui déconne (genre une IP mal configurée à un endroit)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte