【发布时间】:2011-05-28 19:21:57
【问题描述】:
我想知道有什么方法可以禁用来自节点 A 的 UDP 广播数据包以不被节点 A 本身接收。
对于广播,我只是使用INADDR_BROADCAST 并在
接收方我正在使用AI_PASSIVE | AI_NUMERICHOST。
【问题讨论】:
标签: linux sockets networking udp broadcast
我想知道有什么方法可以禁用来自节点 A 的 UDP 广播数据包以不被节点 A 本身接收。
对于广播,我只是使用INADDR_BROADCAST 并在
接收方我正在使用AI_PASSIVE | AI_NUMERICHOST。
【问题讨论】:
标签: linux sockets networking udp broadcast
不,这是广播的基本属性 - 子网上的每个主机,包括发送者,都必须在网络堆栈的整个过程中处理数据包。你的选择是:
IP_MULTICAST_LOOP 套接字选项显式控制多播环回。 bind(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,...) ...
这样,未到达指定接口(而是源自该接口)的数据将不会被接收。
【讨论】:
这是我对 Python 的套接字库的实验结果。 UDP广播器是否接收自己发送的消息取决于您将广播套接字绑定到哪个地址。为了更清楚起见,广播公司的 IP 地址是 192.168.2.1。
在所有这些情况下,接收方都收到了广播的 UDP 消息。
附:在 Python 2.7.9、OS Raspbian 8(Debian 适配树莓派)、Linux 内核 4.4.38 上测试
【讨论】:
'<broadcast>'?那是主机名、别名等吗?我一直看到它,但没有人说它是什么。