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

Posted

技术标签:

【中文标题】发送UDP广播,接收多条消息【英文标题】:Sending UDP broadcast, receiving multiple messages 【发布时间】:2012-06-05 15:52:15 【问题描述】:

我有 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();
  

【问题讨论】:

嗨。我想使用您的代码进行 UDP 文件传输。但我不知道如何处理接收部分!应该如何实施?它将如何开始从网络获取内容? @Shamim,网络上有很多资源,谷歌搜索应该会有所帮助。查找服务器/客户端示例。 IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000); 可以是 IPEndPoint ip = null; - 它不是一个结构。它在EndReceive() 方法中的用途是定义发送者。用任何东西填充它有点误导。 你的问题作为一个答案真的很有帮助,因为我在做环回 udp 从不丢失 =) 谢谢你 几个小时后,这段代码似乎崩溃并给出错误“由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作”知道为什么吗?跨度> 【参考方案1】:

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

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

具体来说(在 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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

你的问题已经回答了。当我通过电缆连接时,我的笔记本电脑的无线已打开。所以我通过有线和无线收到了包裹。谢谢。【参考方案4】:

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

【讨论】:

以上是关于发送UDP广播,接收多条消息的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中接收 UDP 广播消息

Android 使用udp发送广播

从服务器接收多个 sendto()

在节点js中获取UDP的目标地址

Python网络编程—UDP套接字广播

如何通过 UDP 套接字进行广播?