我正在寫一個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) {
...
}
...
}
如果eth0和eth1是在同一個子網,並不意味着你會得到每一個廣播包的兩倍?這可能是爲什麼它被過濾出來,只能交付給一個適配器? – ypnos 2014-08-27 12:54:45
這是一個小竅門。 NIC地址屬於同一個子網,但它們物理連接到不同的網絡,它們具有不同的數據包。 – 2014-08-27 12:59:32
您是否嘗試將eth0配置爲不同的子網?如果eth1在eth0關閉時運行,您是否嘗試過? – ypnos 2014-08-27 13:31:07