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測試此代碼。