禁用UDP广播的自我接收

时间:2010-12-21 12:29:02

标签: linux sockets networking udp broadcast

我想知道有什么方法可以禁止节点A的UDP广播包没有被节点A本身接收。

对于braodcast,我只是简单地使用INADDR_BROADCAST 接收方我正在使用AI_PASSIVE | AI_NUMERICHOST

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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,...) ...

这样就不会收到未到达指定接口的数据(而是来自它的数据)。

答案 2 :(得分:1)

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

  • 绑定到'192.168.2.255'或''(空地址)时,广播公司接收自己发送的消息
  • 绑定到'192.168.2.1','255.255.255.255'或'&lt; broadcast&gt;'时,广播公司将不会收到自己发送的消息

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

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