我正在编写一个Linux程序,该程序应该从系统中存在的任何网络接口上的指定端口接收UDP广播包。
但是,如果系统具有同一子网地址的多个网络接口,则只有第一个接口才接受数据包。
例如,如果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) {
        ...
    }
...
}

最佳答案

如果我理解正确,您有两个网卡,连接到两个物理网络(即网络电缆、集线器),每个网卡都有来自同一子网地址范围的单独IP地址?
简而言之,您的网络配置是错误的。如果它们真的是独立的物理网络,那么它们应该有不同的子网地址。这取决于你所说的分开的物理网络,分开的硬件是什么意思?不能有两个具有相同子网地址的独立子网。这就是为什么我说你的网络配置是错误的。
但是,我得到的印象是,您正在尝试桥接这两个网络,以便这两个NIC属于同一子网(而不是分开的)。好吧,那你应该搭桥。将两个NIC桥接在一起,并为桥接分配一个IP地址。然后您将能够在两个NIC上接收数据包。
在linux中:

brctl addbr br0
ifconfig eth0 0.0.0.0 down
ifconfig eth1 0.0.0.0 down
brctl addif br0 eth0
brctl addif br0 eth1
ifconfig eth0 up
ifconfig eth1 up
ifconfig br0 up
ifconfig br0 192.168.225.107 (or 192.168.225.108, whatever you prefer)

10-08 09:46