2014-08-27 77 views
0

我正在写一个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) { 
     ... 
    } 
... 
} 
+1

如果eth0和eth1是在同一个子网,并不意味着你会得到每一个广播包的两倍?这可能是为什么它被过滤出来,只能交付给一个适配器? – ypnos 2014-08-27 12:54:45

+0

这是一个小窍门。 NIC地址属于同一个子网,但它们物理连接到不同的网络,它们具有不同的数据包。 – 2014-08-27 12:59:32

+0

您是否尝试将eth0配置为不同的子网?如果eth1在eth0关闭时运行,您是否尝试过? – ypnos 2014-08-27 13:31:07

回答

1

如果我正确理解你,你有两个网卡,连接到两个物理网络(即网络电缆,集线器),其中每一个具有从一个单独的IP地址相同的子网地址范围?

简而言之,您的网络配置错误。如果他们真的是独立的物理网络,那么他们应该有不同的子网地址。这取决于你对独立物理网络的意义,单独的硬件?您不能有两个具有相同子网地址的独立子网。这就是为什么我说你的网络配置是错误的。

但是,我得到的印象是您试图桥接两个网络,以便两个NIC属于相同的子网(不单独)。那么,你应该桥接它们。您将两个NIC桥接在一起,并为该桥分配一个IP地址。然后你将能够在两个网卡上接收你的数据包。

在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) 
+0

谢谢,这是一个好主意。它适用于测试机器,但不幸的是,我无法更改目标平台上的网络配置。 – 2014-08-29 09:05:39