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();
}
}
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.
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.
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.