40

我有 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

4 回答 4

33

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

于 2012-05-31T11:39:43.647 回答
6

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

于 2012-05-31T11:43:31.437 回答
1

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

于 2018-03-18T06:08:00.050 回答
0

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

我在虚拟机上遇到了这个问题,比我更聪明的网络专家解决了这个问题,他向虚拟机添加了一个虚拟 NIC,让我运行“路由删除”和“路由添加”命令。

具体来说(在 Windows 10 虚拟机上),如果新的虚拟网卡是 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

于 2019-03-09T04:01:02.877 回答