【发布时间】:2014-10-20 23:45:32
【问题描述】:
我正在为 Linux 编写一个程序,它应该从系统中存在的任何网络接口上的指定端口接收 UDP 广播数据包。
但是,如果系统有多个相同子网地址的网络接口,则数据包只被第一个接口接受。
例如,如果 eth0 有 192.168.225.107,而 eth1 有 192.168.225.108,则仅接受来自 eth0 的数据包。
NIC 连接到不同的物理网络。根据 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 在同一个子网中,那是不是意味着每个广播数据包都会收到两次?这可能是它被过滤掉并仅交付给一个适配器的原因吗?
-
这里有一个小技巧。网卡地址属于同一个子网,但物理上连接到不同的网络,有不同的数据包。
-
您是否尝试将 eth0 配置为不同的子网?当 eth0 关闭时,您是否尝试过 eth1 是否正常工作?
-
您不能绑定到多个网卡。您可以绑定到 INADDR_ANY,就像您正在做的那样。那么你的问题是什么?
-
是的,然后我关闭了 eth0,来自 eth1 的数据包就可以了。我的问题是:为什么,虽然我使用的是 INADDR_ANY,但我只能看到来自分配给第一个网卡的地址的数据包。
标签: c linux sockets udp broadcast