【发布时间】:2016-04-20 16:35:38
【问题描述】:
在我正在使用的设置中,我有多个接口,其中一些具有完全相同的 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 kernel 4.1.5 在 RedHat 7.1 上测试此代码。
【问题讨论】:
标签: c++ linux sockets network-programming redhat