UDP在绑定到一个NIC的多个进程中广播数据包
本文关键字:进程 数据包 广播 NIC 绑定 UDP 一个 | 更新日期: 2023-09-27 18:20:04
我正在考虑一个.NET对等应用程序的想法,其中一个对等方使用UDP数据包在子网上通告其存在。然后,任何监听对等体都将从数据包中获得足够的信息,以使用TCP建立与广告商的直接通信信道。
似乎广播数据包需要指向特定的端口号,并且,为了接收数据包,对等方需要绑定到IPAddress.Any.上的该端口
有了这种设计,有可能运行绑定到同一NIC的多个对等机吗?我只得到一个SocketException"每个套接字地址(协议/网络地址/端口)通常只允许使用一次",直到我添加以下代码行:
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
设置此选项的含义是什么?
我不确定你是否能用广播做到这一点。另一方面,这是链路本地多播的标准做法。由于IPv6多播API比IPv4 API设计得更好,我建议使用IPv6链接本地-您不需要全局IPv6地址和路由,即使没有IPv6连接,您的应用程序也可以在任何现代系统上工作。
首先,选择一个随机的IPv6链路本地多播组,ff02::/16
中的任何内容都可以(详细信息请参见RFC 4291第2.7节)。然后,您的应用程序应该:
- 在插座上设置
SO_REUSEADDR
- 绑定到您选择的端口
- 将
IPV6_MULTICAST_LOOP
设置为0、将IPV6_MULTICAST_HOPS
设置为1 - 使用CCD_ 5订阅多播组
- 将UDP数据包发送到具有CCD_ 6中传出接口的接口id的多播组
- 通过检查CCD_ 7来确定接收到的分组的传入接口
这在RFC 3493第5.2节中有详细描述。