发送UDP广播,接收多条消息

时间:2012-05-31 11:34:04

标签: c# udp broadcasting

我有2个程序,1个用于发送UDP广播消息,1个用于监听此广播。我的问题是,有时当我发送广播时,接收器会收到2条消息。为什么呢?

收件人代码:

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

发件人代码:

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 个答案:

答案 0 :(得分:28)

严格地说,IP网络中的数据包重复是允许的网络行为,你必须能够在你的软件中处理它,即使你这次会以某种方式摆脱它。如果您只是想知道为什么在您的特定情况下会发生这种情况......乍一看,我发现您的代码没有任何问题。您是否在计算机的以太网端口上有多个IP地址?我认为wireshark可能有助于获得有关正在发生的事情的更多详细信息。

答案 1 :(得分:6)

UDP数据包不可靠,完全有可能你会获得相同的数据包两次甚至根本没有,当使用udp时你需要在数据中包含某种唯一ID,这样你就可以丢弃错误或请求重新发送。

答案 2 :(得分:0)

原因是当您广播时,您将消息发送到网络中的所有端点。由于您在同一个网络中,因为它是广播的,您将收到相同的消息。您可以为此编写自定义过滤器。

答案 3 :(得分:0)

请记住,(1)UDP数据包对于同一路由器上的所有客户端都是非常可靠的,并且(2)当从服务器到客户端的路径多于一条时,可能会发生数据包重复。

我在VM上遇到了这个问题,这比一个比我聪明的网络专家解决了,他向VM添加了虚拟NIC并让我运行“ route delete”和“ route add”命令。

特别是(在Windows 10 VM上),如果新的虚拟NIC为10.10.10.10: 路由删除224.0.0.0掩码240.0.0.0 路由添加224.0.0.0掩码240.0.0.0 10.10.10.10