【问题标题】:Disabling self-reception of UDP broadcasts禁用 UDP 广播的自接收
【发布时间】:2011-05-28 19:21:57
【问题描述】:

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

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

【问题讨论】:

    标签: linux sockets networking udp broadcast


    【解决方案1】:

    不,这是广播的基本属性 - 子网上的每个主机,包括发送者,都必须在网络堆栈的整个过程中处理数据包。你的选择是:

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

    【讨论】:

    • 另一种选择是查看每个传入数据包的 src IP,并忽略来自本地 IP 的数据包。
    • 是的,但是对于多播,这是在硬件/内核级别完成的。
    • 因为每个应用程序都在进行广播并列出其他应用程序广播到固定的 numbet 端口。做不到。
    • @Remy :- 我目前的实现只是这样。我希望避免这种情况。
    【解决方案2】:

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

      #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,...) ...
    

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

    【讨论】:

      【解决方案3】:

      这是我对 Python 的套接字库的实验结果。 UDP广播器是否接收自己发送的消息取决于您将广播套接字绑定到哪个地址。为了更清楚起见,广播公司的 IP 地址是 192.168.2.1。

      • 绑定到 '192.168.2.255' 或 ''(空地址)时,广播者接收自己发送的消息
      • 当绑定到“192.168.2.1”、“255.255.255.255”或“”时,广播者将不会收到自己发送的消息

      在所有这些情况下,接收方都收到了广播的 UDP 消息。

      附:在 Python 2.7.9、OS Raspbian 8(Debian 适配树莓派)、Linux 内核 4.4.38 上测试

      【讨论】:

      • 什么是'&lt;broadcast&gt;'?那是主机名、别名等吗?我一直看到它,但没有人说它是什么。
      • @ThatsRightJack 我想这是一个常量来标记连接是否是广播。 CMIIW
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多