UDP在绑定到一个NIC的多个进程中广播数据包

本文关键字:进程 数据包 广播 NIC 绑定 UDP 一个 | 更新日期: 2023-09-27 18:20:04

我正在考虑一个.NET对等应用程序的想法,其中一个对等方使用UDP数据包在子网上通告其存在。然后,任何监听对等体都将从数据包中获得足够的信息,以使用TCP建立与广告商的直接通信信道。

似乎广播数据包需要指向特定的端口号,并且,为了接收数据包,对等方需要绑定到IPAddress.Any.上的该端口

有了这种设计,有可能运行绑定到同一NIC的多个对等机吗?我只得到一个SocketException"每个套接字地址(协议/网络地址/端口)通常只允许使用一次",直到我添加以下代码行:

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

设置此选项的含义是什么?

UDP在绑定到一个NIC的多个进程中广播数据包

我不确定你是否能用广播做到这一点。另一方面,这是链路本地多播的标准做法。由于IPv6多播API比IPv4 API设计得更好,我建议使用IPv6链接本地-您不需要全局IPv6地址和路由,即使没有IPv6连接,您的应用程序也可以在任何现代系统上工作。

首先,选择一个随机的IPv6链路本地多播组,ff02::/16中的任何内容都可以(详细信息请参见RFC 4291第2.7节)。然后,您的应用程序应该:

  1. 在插座上设置SO_REUSEADDR
  2. 绑定到您选择的端口
  3. IPV6_MULTICAST_LOOP设置为0、将IPV6_MULTICAST_HOPS设置为1
  4. 使用CCD_ 5订阅多播组
  5. 将UDP数据包发送到具有CCD_ 6中传出接口的接口id的多播组
  6. 通过检查CCD_ 7来确定接收到的分组的传入接口

这在RFC 3493第5.2节中有详细描述。