从SIOCGIFCONF& amp;获得的接口名称不正确SIOCGIFADDR用于solaris sparc中的虚拟接口

时间:2017-05-17 09:30:30

标签: c++ solaris sparc network-interface

我有一个程序可以获取solaris机器(x86和sparc)中的接口列表,包括虚拟接口。

我使用以下代码来获取它。

// create socket
int fd;
if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0)
    return 0;

// Get list of interfaces
struct ifconf Ifc;
struct ifreq  IfcBuf[MAX_NUM_IFREQ];
struct ifreq*  pIfr;
Ifc.ifc_len = sizeof(IfcBuf);
Ifc.ifc_buf = (char*) IfcBuf;
if (ioctl(fd, SIOCGIFCONF, &Ifc) < 0)
    return 0;

// loop interfaces
int num_ifreq = Ifc.ifc_len / sizeof(struct ifreq);
int i;
for (pIfr = Ifc.ifc_req, i = 0; i < num_ifreq; pIfr++, i++)
{
    // Request the address
    if (ioctl(fd, SIOCGIFADDR, pIfr) < 0)
        return 0;

    // get interfaceName
    char* interfaceName= (char*) lstrdup(pIfr->ifr_name);
    ...
}

在Solaris x86中,程序按预期工作。它可以获得所有接口,包括虚拟接口。 但是,在Solaris Sparc中,虚拟接口的名称不正确。

例如,如果我有以下接口(ifconfig -a): vxx1111111111:1是vxx1111111111的虚拟接口。

lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
vxxx11111111111: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.101.208 netmask ffffff00 broadcast 192.168.101.255
        ether 1:1:11:11:11:11
vxxx11111111111:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.101.220 netmask ffffff00 broadcast 192.168.101.255

程序生成的接口名称为:lo0,vxxx11111111111,vxxx11111111111。 第三个应该是'vxxx11111111111:1'

如果我在Solaris x86上运行相同的代码,我会获得虚拟接口的正确接口名称。

为什么我无法在Solaris Sparc计算机上获得虚拟接口的正确接口名称?

1 个答案:

答案 0 :(得分:0)

生成的虚拟接口名称太长。 根据{{​​3}},最大长度为16个字符。