绑定到一个NIC

时间:2015-10-31 10:04:06

标签: c# .net sockets udp

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

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

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

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

设置此选项有什么含义?

1 个答案:

答案 0 :(得分:1)

我不确定你是否可以通过广播来做到这一点。另一方面,它是链接本地多播的标准做法。由于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. 使用IPV6_JOIN_GROUP;
  5. 订阅多播组
  6. 使用sin6_scope_id中的出接口的接口ID将UDP数据包发送到组播组。
  7. 通过选中sin6_scope_id确定收到的数据包的传入接口。
  8. 这在RFC 3493第5.2节中有详细描述。