我有兩個網絡鏈接到互聯網,我有兩個缺省路由設置:使用BINDTODEVICE時無法在多個套接字上偵聽?
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway0 0.0.0.0 UG 0 0 eth0
default gateway1 0.0.0.0 UG 0 0 eth1
...
我創建了兩個插槽與BINDTODEVICE,這樣我就可以向外發送數據或者爲eth0或eth1的。我也試圖使用recvfrom
(僅限UDP數據)在兩個套接字上偵聽,但是我只能成功讀取路由中第一個列出的接口的數據。例如,eth0
的作品,但我沒有從綁定到eth1
的套接字中得到任何東西。
在任一接口上運行wireshark顯示數據傳入成功 - 也就是說,我可以看到數據從Internet發送到Wireshark中的eth0或eth1的IP(因此NAT不是任何問題),但是我的程序只是在recvfrom
上沒有得到任何數據。
我已經嘗試在套接字上使用bind
來使它們監聽各自接口的IP,並且還嘗試不使用綁定讓它們在0.0.0.0上偵聽(每個端口都在不同的端口上),但我仍然有相同的問題。
我怎樣才能確保兩個套接字獲取他們應該的數據?
編輯:示例代碼:
int createDeviceBoundUDPSocket(uint32_t sip, uint16_t sport, const char* bind_dev) {
printf("bind_dev = %s", bind_dev);
int s = socket(AF_INET, SOCK_DGRAM, 0);
int result;
struct sockaddr_in my_ip_addr;
if (s < 0) {
perror("socket");
return s;
}
memset(&my_ip_addr, 0, sizeof(my_ip_addr));
my_ip_addr.sin_family = AF_INET;
my_ip_addr.sin_addr.s_addr = htonl(sip);
my_ip_addr.sin_port = htons(sport);
// commenting this section out doesn't seem to make a difference
// listening on 0.0.0.0 or the interface's IP both have the same problem
result = bind(s, (struct sockaddr*)(&my_ip_addr), sizeof(my_ip_addr));
if (result < 0) {
perror("Error in bind");
return result;
}
if (bind_dev) {
// Bind to specific device.
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE,
bind_dev, strlen(bind_dev) + 1)) {
perror("Error binding to device");
return -1;
}
}
return s;
}
請顯示您的實際代碼。您很可能沒有正確設置綁定。 –
綁定工作用於發送數據,併爲一個接口工作接收數據。所以我目前不懷疑那部分。 – erjiang
不要混合'bind()'和'SO_BINDTODEVICE'。使用一個或另一個。通常,你應該使用'bind()'。 –