从 SIOCGIFCONF 和 SIOCGIFADDR 获取的用于 solaris sparc 中的虚拟接口的接口名称不正确
incorrect interface name obtained from SIOCGIFCONF & SIOCGIFADDR for virtual interface in solaris sparc
我有一个程序可以获取 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 机器上虚拟接口的正确接口名称?
生成的虚拟接口名称太长。
根据 this,最大长度为 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是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 机器上虚拟接口的正确接口名称?
生成的虚拟接口名称太长。 根据 this,最大长度为 16 个字符。