繁体   English   中英

如何将套接字绑定到虚拟接口?

[英]How to bind sockets to a virtual interface?

在设置中,我使用的是多个接口,其中一些接口具有完全相同的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测试此代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM