我正在编写一个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) {
...
}
...
}
答案 0 :(得分:1)
如果我理解正确,你有两个网卡连接到两个物理网络(即网线,集线器),每个网卡都有一个来自同一子网地址范围的独立IP地址?
简短的回答是您的网络配置错误。如果它们确实是单独的物理网络,那么它们应该具有不同的子网地址。这取决于你对单独的物理网络,单独的硬件的意思?您不能拥有两个具有相同子网地址的独立子网。这就是我说你的网络配置错误的原因。
但是,我得到的印象是你试图桥接这两个网络,以便两个网卡属于同一个子网(不是分开的)。那么,你应该桥接他们。您将两个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)