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