web-dev-qa-db-fra.com

Envoi de diffusion UDP, réception de plusieurs messages

J'ai 2 programmes, 1 pour l'envoi d'un message diffusé UDP et 1 écoute pour cette diffusion. Mon problème est que parfois, quand j'envoie une émission, le récepteur reçoit 2 messages. Pourquoi?

Code du destinataire:

public class Receiver {
  private readonly UdpClient udp = new UdpClient(15000);
  private void StartListening()
  {
    this.udp.BeginReceive(Receive, new object());
  }
  private void Receive(IAsyncResult ar)
  {
    IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000);
    byte[] bytes = udp.EndReceive(ar, ref ip);
    string message = Encoding.ASCII.GetString(bytes);
    StartListening();
  }
}

Code expéditeur:

public class Sender {
  public void Send() {
    UdpClient client = new UdpClient();
    IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000);
    byte[] bytes = Encoding.ASCII.GetBytes("Foo");
    client.Send(bytes, bytes.Length, ip);
    client.Close();
  }
}
33
Paw Baltzersen

Strictement parlant, la duplication de paquets sur un réseau IP est autorisée dans le comportement du réseau et vous devez être en mesure de la gérer dans votre logiciel, même si vous vous en débarrassez cette fois. Si vous vous demandez simplement pourquoi cela se produit dans votre cas particulier ... à première vue, votre code ne présente aucun problème. Avez-vous plusieurs adresses IP sur le port Ethernet de votre ordinateur ou d’autres? Je pense que wireshark pourrait aider à obtenir plus de détails sur ce qui se passe.

26
Eugene Ryabtsev

Les paquets UDP n'étant pas fiables, il est tout à fait possible que vous obteniez le même paquet deux fois, voire aucun, lorsque vous utilisez udp, vous devez inclure une sorte d'identifiant unique dans vos données pour pouvoir éliminer les erreurs ou demander un renvoi.

6
Andy

La raison en est que lorsque vous diffusez, vous envoyez votre message à tous les points de terminaison du réseau. Puisque vous êtes sur le même réseau, vous recevrez le même message car il est diffusé. Vous pouvez écrire un filtre personnalisé pour cela.

0
Shiran Abbasi