我想知道有什么方法可以禁止节点A的UDP广播包没有被节点A本身接收。
对于braodcast,我只是简单地使用INADDR_BROADCAST
接收方我正在使用AI_PASSIVE | AI_NUMERICHOST
。
答案 0 :(得分:2)
不,这是广播的基本属性 - 子网上的每个主机(包括发送方)都必须在网络堆栈中一直处理数据包。您可以选择:
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。
接收方在所有这些情况下都收到了广播的UDP消息。
P.S。测试了Python 2.7.9,OS Raspbian 8(适用于Raspberry Pi的Debian),Linux内核4.4.38