禁用 UDP 广播的自接收

发布于 2024-10-08 18:46:54 字数 143 浏览 4 评论 0原文

我想知道有什么方法可以禁用来自节点 A 的 UDP 广播数据包,使其不被节点 A 本身接收。

对于广播,我只是使用 INADDR_BROADCAST 并在 接收端我正在使用 AI_PASSIVE | AI_NUMERICHOST。

I wish to know is there any way I can disable the UDP broadcast packet from the node A to not received by node A itself.

For braodcast I am simply using INADDR_BROADCAST and on the
receiver side I am using AI_PASSIVE | AI_NUMERICHOST.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

居里长安 2024-10-15 18:46:54

不,这是广播的基本属性 - 子网上的每个主机(包括发送者)都必须在网络堆栈中一直处理数据包。您的选项是:

  • 切换到多播。这是首选,因为与广播相比,多播减少了整个网络的负载,并且您可以使用 IP_MULTICAST_LOOP 套接字选项。
  • 不要 bind(2)< /code>发送机器上的目标端口。这可行,但有点笨拙,因为它对应用程序设计和/或部署施加了限制。

No, this is fundamental property of broadcasting - every host on the subnet, including the sender, will have to process the packet all the way up the network stack. You options are:

  • Switch to multicast. This is preferred since multicast reduces the load on the whole network compared to broadcast, and because you can explicitly control multicast loopback with the IP_MULTICAST_LOOP socket option.
  • Don't bind(2) the destination port on the sending machine. This works but is sort of kludgy since it puts restrictions on application design and/or deployment.
被翻牌 2024-10-15 18:46:54

绑定到接口,而不仅仅是地址。

  #include <net/if.h>
  #include <socket.h>

  struct ifreq interface;
  strcpy(interface.ifr_ifrn.ifrn_name, "eth0");

  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface));

  //... bind(fd,...) ...

这样,未到达指定接口(而是源自该接口)的数据将不会被接收。

Bind to interface, not just address.

  #include <net/if.h>
  #include <socket.h>

  struct ifreq interface;
  strcpy(interface.ifr_ifrn.ifrn_name, "eth0");

  int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface));

  //... bind(fd,...) ...

This way data that didn't arrive at the interface specified (but originated from it instead) will not be received.

淡看悲欢离合 2024-10-15 18:46:54

以下是我使用 Python 套接字库进行实验的结果。 UDP广播器是否接收自己发送的消息取决于您将广播套接字绑定到什么地址。为了更清楚起见,广播公司的 IP 地址是 192.168.2.1。

  • 当绑定到“192.168.2.255”或“”(空地址)时,广播者接收自己发送的消息
  • 当绑定到“192.168.2.1”、“255.255.255.255”或“<广播>”时,广播者将不会接收发送的消息 在所有这些情况下,接收方都会自行

接收广播的 UDP 消息。

PS 在 Python 2.7.9、操作系统 Raspbian 8(针对 Raspberry Pi 的 Debian 改编)、Linux 内核 4.4.38 上进行测试

Here are results of my experiments with Python's socket library. Whether UDP broadcaster receives messages sent by itself is dependent on what address will you bind broadcasting socket to. For greater clarity, broadcaster's IP address was 192.168.2.1.

  • When binding to '192.168.2.255' or '' (empty address), broadcaster receives messages sent by itself
  • When binding to '192.168.2.1', '255.255.255.255' or '<broadcast>', broadcaster will NOT receive messages sent by itself

Receiver received broadcasted UDP messages in all these cases.

P.S. Tested on Python 2.7.9, OS Raspbian 8 (adaptation of Debian for Raspberry Pi), Linux kernel 4.4.38

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文