2014-01-19 74 views
1

我有兩個網絡鏈接到互聯網,我有兩個缺省路由設置:使用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; 
} 
+0

請顯示您的實際代碼。您很可能沒有正確設置綁定。 –

+0

綁定工作用於發送數據,併爲一個接口工作接收數據。所以我目前不懷疑那部分。 – erjiang

+0

不要混合'bind()'和'SO_BINDTODEVICE'。使用一個或另一個。通常,你應該使用'bind()'。 –

回答