2016-04-20 53 views
0

在我正在使用的設置中,我有多個接口,其中一些具有完全相同的IP。即:ifconfig返回如何將套接字綁定到虛擬接口?

eno1: ... inet 192.168.2.1 netmask 255.255.255.0 ... 
eno2: ... inet 192.168.2.1 netmask 255.255.255.0 ... 

是的,我知道這很瘋狂,但不幸的是我無法更改IP。所以,當我綁定的插座,在這種特定的情況下,他們是UDP套接字接收數據,我必須套接字接口綁定是這樣的:

// if interface is provided, bind to the interface 
if (szIfr != 0) 
{ 
    struct ifreq ifr; 
    memset(&ifr, 0, sizeof(ifr)); 
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), szIfr); 
    if (setsockopt(m_sSocket, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) 
    { 
     printf("OPEN(): error binding to %s. Error returned: %s\n", szIfr, strerror(errno)); 
     return CUDP_BIND; 
    } 
} 

和它完美的作品。但是我在使用虛擬接口綁定套接字時遇到了問題。這是我的實際建立

... 
eno1: ... inet 192.168.2.1 netmask 255.255.255.0 ... 
eno1:0: ... inet 10.24.6.1  netmask 255.255.255.0 ... 
eno1:1: ... inet 10.8.6.4  netmask 255.255.255.0 ... 
eno2: ... inet 192.168.2.1 netmask 255.255.255.0 ... 
... 

所以,當我嘗試綁定到eno1:0我得到這個錯誤:No such device,它也是情理之中。因爲界面是虛擬的並且不存在。但是,如果我嘗試使用虛擬接口的IP綁定到真實接口eno1,我不會在該套接字上收到任何數據包。如果我只是將它綁定到IP而不指定接口名稱,我不會收到任何錯誤,但我仍然沒有收到數據。

我在做什麼錯在這裏?這與界面設置有關嗎?還是我必須修改我的代碼?

我在RedHat 7.1上使用內核redhat內核4.1.5測試此代碼。

回答

1

eno1:0不是虛擬接口,它只是eno1的別名。綁定到IP 0.0.0.0的eno1(INADDR_ANY)也適用於虛擬接口。當您在多個設備上具有相同的網絡地址時,更大的問題是路由表,用於決定發送數據時使用哪個接口

相關問題