我正在写一个Linux程序,它应该接收来自系统中存在的任何网络接口上的指定端口的UDP广播数据包。UDP广播接收 - 绑定到几个NIC的
但是,如果系统有多个具有相同子网地址的网络接口,则只能通过第一个接口接受数据包。
例如,如果eth0具有192.168.225.107,并且eth1具有192.168.225.108,那么只能从eth0接受数据包。
网卡连接到不同的物理网络。根据tcpdump,数据包存在于两个网络中。
代码(错误检查跳过):
sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &on, sizeof(on));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *) &s, sizeof(s));
bzero(&serv_addr_ip, sizeof(serv_addr_ip));
serv_addr_ip.sin_family = AF_INET;
serv_addr_ip.sin_port = htons(port);
serv_addr_ip.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr = (struct sockaddr *) &serv_addr_ip;
addr_len = sizeof(struct sockaddr_in);
bind(sock, serv_addr, addr_len);
while (1) {
if ((chars = recvfrom(sock, var.buf, MSG_MAX, 0, serv_addr, &addr_len)) < 0) {
...
}
...
}
如果eth0和eth1是在同一个子网,并不意味着你会得到每一个广播包的两倍?这可能是为什么它被过滤出来,只能交付给一个适配器? – ypnos 2014-08-27 12:54:45
这是一个小窍门。 NIC地址属于同一个子网,但它们物理连接到不同的网络,它们具有不同的数据包。 – 2014-08-27 12:59:32
您是否尝试将eth0配置为不同的子网?如果eth1在eth0关闭时运行,您是否尝试过? – ypnos 2014-08-27 13:31:07