【问题标题】:How to bind sockets to a virtual interface?如何将套接字绑定到虚拟接口?
【发布时间】: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


    【解决方案1】:

    eno1:0 不是虚拟接口,它只是 eno1 的别名。使用 IP 0.0.0.0 (INADDR_ANY) 绑定到 eno1 也应该适用于虚拟接口。当您在多个设备上具有相同的网络地址时,更大的问题是路由表,它用于决定发送数据时使用哪个接口

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多