当前位置: 首页 > 知识库问答 >
问题:

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

宗苗宣
2023-03-14

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

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

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

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

设置这一选项有何影响?

共有1个答案

孟花蜂
2023-03-14

我不确定你能不能用广播做到这一点。另一方面,它是链路本地组播的标准实践。由于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. 使用sin6_scope_id中传出接口的接口id向多播组发送UDP数据包。
  6. 通过检查sin6_scope_id确定接收数据包的传入接口。

RFC 3493第5.2节对此进行了详细描述。

 类似资料:
  • 我们所有的例子这一点利用传输方式称为“单播”:“将消息发送给一个网络拥有唯一地址的目的地”,这种模式支持连接和无连接协议。 然而,UDP 提供了额外的传输模式对多个接收者发送消息: 多播:传送给一组主机 广播:传送到网络上的所有主机(或子网) 示例应用程序在本章将说明使用 UDP 广播发送消息,可以接收到所有主机在同一网络。为此我们将使用特殊的“有限广播”或“零”网络地址255.255.255.2

  • 我在Amazon EC2中有多个应用程序实例,每个实例都运行几个工作进程。我希望每个工作进程都订阅一些通知(例如配置更改)。这个通知基本上应该是广播消息,这样一旦发送,每个工作人员都会收到它。 我知道SQS不支持消息广播。通过查看类似的问题/线索,我看到了使用SNS而不是SQS的建议。由于以下原因,我不确定这是否适用于我: 应用程序实例是自动缩放组的一部分,因此可以动态添加和删除它们。在这种情况下

  • 我们现有的软件定期向本地子网(X.X.X.255)上的特定端口(7125)广播UDP数据包。我们的监控软件运行在HP-UX(11.11)上,可以接收这些数据包,没有问题。然而,在将监控软件移植到Linux(RHEL6.1)之后,我们发现它并没有接收到广播数据包。tcpdump显示了到达Linux主机的数据包,但内核不会将它们发送给我们的软件。 我使用了几个Python2.x脚本,这些脚本模拟了监控

  • 我正在尝试接收通过LAN电缆连接的FPGA发送的UDP广播数据包。FPGA向端口5001发送连续数据包。 我的python接收器代码很简单: 我使用Wireshark进行了检查,发现PC接收数据包。但是,我的Python代码没有。我还检查了从另一个本地python代码发送数据包的情况(发送到相同的地址和端口),并且我的接收器获得了这些数据包。

  • 问题内容: 我想知道是否可以在从相同的node-websocket-server应用程序实例运行的不同websocket“连接”上进行广播。想象一下一个具有多个会议室的聊天室服务器,它在单个node.js服务器进程中仅向特定于每个会议室的参与者广播消息。我已经成功实现了每个进程一个聊天室的解决方案,但我想将其带入一个新的高度。 问题答案: 您可能想尝试Push-it:http : //github

  • 也许是基于代码创建的队列,它由其他现有队列支持?