2014-08-27 36 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