2010-12-21 146 views
2

我想知道是否有任何方法可以禁止节点A本身从节点A到rcvd的UDP广播数据包。对于braodcast,我简单地使用INADDR_BROADCAST,并在 rcvr端使用AI_PASSIVE | AI_NUMERICHOST。禁用UDP广播的自我接收

感谢 Arpit

回答

2

不,这是广播的基本属性 - 子网中的所有主机,包括发送者,必须处理数据包一路上扬的网络堆栈。你的选择是:

  • 切换到multicast。这是首选,因为与广播相比,多播减少了整个网络的负载,并且您可以通过IP_MULTICAST_LOOP套接字选项显式控制组播环回。
  • 请勿将bind(2)发送机器上的目标端口。这种方法很有效,但是由于它限制了应用程序的设计和/或部署,所以它有点笨拙。
+0

另一种方法是查看每个传入数据包的src IP,并简单地忽略来自本地IP的数据包(S)。 – 2010-12-26 07:54:52

+0

是的,但使用多播,这是在硬件/内核级别完成的。 – 2010-12-26 17:33:47

+0

由于每个应用程序正在进行广播和列表到其他人广播到固定的纽波特端口。它不能做到。 – Arpit 2010-12-27 08:42:45

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

这样数据没有到达指定的接口(而是源于它的接口)将不会被接收。

1

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

  • 当绑定到 '192.168.2.255' 或 ''(空地址),广播接收自己发送消息
  • 当绑定到 '192.168.2.1', '255.255.255.255' 或'<广播> ',广播公司不会收到自己发送的消息

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

P.S.测试了Python 2.7.9,OS Raspbian 8(适用于Raspberry Pi的Debian),Linux内核4.4.38