从 SIOCGIFCONF 和 SIOCGIFADDR 获取的 Solaris SPARC 中虚拟接口的接口名称不正确

incorrect interface name obtained from SIOCGIFCONF & SIOCGIFADDR for virtual interface in solaris sparc

本文关键字:接口 虚拟 不正确 Solaris SIOCGIFCONF SIOCGIFADDR 获取 SPARC      更新时间:2023-10-16

我有一个程序,可以获取 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 是 vxx11111111111 的虚拟接口。
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、vxxx111111111111。

第三个应该是'vxxx11111111111:1'

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

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

生成的虚拟接口名称太长。据此,最大长度为 16 个字符。