发送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广播,接收多条消息的主要内容,如果未能解决你的问题,请参考以下文章