40
votes

I've got 2 programs, 1 for sending an UDP broadcast message and 1 that is listening for this broadcast. My problem is that sometimes when I send a broadcast, the receiver receives 2 messages. Why?

Receiver code:

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

Sender code:

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();
  }
}
4
hi. I wanted to use your code for UDP file transferring. but i don't know what to do with the Receive part! how should it be implemented? how it's going to begin getting stuff from network?Shamim
@Shamim, there are plenty of resources on the web, a bit of googling should help. Look for server/client examples.Paw Baltzersen
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000); can just be IPEndPoint ip = null; - it's not a struct. Its use in the EndReceive() method is to define the sender. Populating it with anything at all is a bit misleading.maxp
Your question really helped as an answer, since I'm doing loopback udp never loss =) thank youVal
After couple of hours it seems this code crush and give error "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full" Any idea why ?Alophind

4 Answers

33
votes

Strictly speaking, packet duplication in IP network is allowed behavior of the network and you have to be able to deal with it in your software even if you will somehow get rid of it this time. If you are just wondering about why this happens in your particular case... at a first glance I see nothing wrong with your code. Do you have several IP addresses on Ethernet port of your computer or some such? I think wireshark might help get more details about what's going on.

6
votes

UDP packets aren't reliable, it's totally possible that you'll get the same packet twice or even none at all, when using udp you need to include some kind of unique ID in your data so you can discard errors or request a resend.

1
votes

The reason is when you broadcast you send your message to all the end points in the network. Since you are in the same network, you will receive the same message because it is broadcasted. You can write a custom filter for that.

0
votes

Keep in mind that (1) UDP packets are VERY reliable for all clients on the same router, and (2) packet duplication can occur when more than one path is available from the server to the client.

I had this problem on a VM, and it was solved by a network guru smarter than me who added a virtual NIC to the VM and had me run "route delete" and "route add" commands.

Specifically (on Windows 10 VM), if the new virtual NIC is 10.10.10.10: route delete 224.0.0.0 mask 240.0.0.0 route add 224.0.0.0 mask 240.0.0.0 10.10.10.10