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

41
我有两个程序,一个用于发送UDP广播消息,另一个用于监听此广播。我的问题是,有时候当我发送广播时,接收方会收到两条消息。为什么会这样呢?
接收端代码:
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
@Shamim,网络上有很多资源,稍微搜索一下应该会有所帮助。寻找服务器/客户端示例。 - Paw Baltzersen
IPEndPoint ip = new IPEndPoint (IPAddress.Any, 15000); 可以简写为 IPEndPoint ip = null; - 它不是一个结构体。在 EndReceive() 方法中使用它是为了定义发送方。随意填充它可能会有点误导。 - maxp
@Alophind 这段代码太老了,我觉得今天我不会用这种方式编写它。我可能会使用一个框架来将其抽象化。 - Paw Baltzersen
@PawBaltzersen 您的意思是UDPClient吗?我试图在几台计算机之间发送和侦听UDP消息,但我不希望每台计算机都接收到自己的消息,只想接收其他计算机的消息。我尝试禁用环回,但没有成功。 - Alophind
显示剩余2条评论
4个回答

33

严格来说,在IP网络中,数据包的复制是网络允许的行为,即使您在这次操作中设法摆脱它,您也必须能够处理软件中的这种情况。 如果您只是想知道为什么会出现这种情况... 乍一看,我认为您的代码没有问题。 您的计算机以太网端口上是否有多个IP地址或类似情况? 我认为,wireshark 可以帮助获取更多信息。


9
你的问题已经得到解答。当我通过有线连接时,我的笔记本电脑的无线网络也被打开了,因此我同时通过有线和无线网络接收到了该数据包。谢谢。 - Paw Baltzersen

6

UDP数据包不可靠,可能会收到相同的数据包两次或者根本没有收到。当使用UDP时,您需要在数据中包含某种唯一标识符,以便丢弃错误或请求重新发送。


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

1
请记住,(1)对于同一路由器上的所有客户端,UDP数据包非常可靠,(2)当服务器到客户端有多条路径可用时,数据包重复可能会发生。
我在虚拟机上遇到了这个问题,一个比我聪明的网络专家通过为虚拟机添加虚拟网卡并让我运行“route delete”和“route add”命令来解决了这个问题。
具体而言(在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接