我想知道是否有任何方法可以禁止节点A本身从节点A到rcvd的UDP广播数据包。对于braodcast,我简单地使用INADDR_BROADCAST,并在 rcvr端使用AI_PASSIVE | AI_NUMERICHOST。禁用UDP广播的自我接收
感谢 Arpit
我想知道是否有任何方法可以禁止节点A本身从节点A到rcvd的UDP广播数据包。对于braodcast,我简单地使用INADDR_BROADCAST,并在 rcvr端使用AI_PASSIVE | AI_NUMERICHOST。禁用UDP广播的自我接收
感谢 Arpit
不,这是广播的基本属性 - 子网中的所有主机,包括发送者,必须处理数据包一路上扬的网络堆栈。你的选择是:
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消息。
P.S.测试了Python 2.7.9,OS Raspbian 8(适用于Raspberry Pi的Debian),Linux内核4.4.38
另一种方法是查看每个传入数据包的src IP,并简单地忽略来自本地IP的数据包(S)。 – 2010-12-26 07:54:52
是的,但使用多播,这是在硬件/内核级别完成的。 – 2010-12-26 17:33:47
由于每个应用程序正在进行广播和列表到其他人广播到固定的纽波特端口。它不能做到。 – Arpit 2010-12-27 08:42:45