以下函数确定给定字符串是否为有效的网络设备名称。
int isValidNDevice(char *name) {
char data[4096];
struct ifconf ifc;
struct ifreq *ifr;
int sk;
int nIntfcs;
sk = socket(AF_INET, SOCK_DGRAM, 0);
if(sk < 0)
{
perror("socket");
return 0;
}
ifc.ifc_len = sizeof(data);
ifc.ifc_buf = (caddr_t)data;
if(ioctl(sk, SIOCGIFCONF, &ifc) < 0)
{
perror("ioctl(SIOCGIFCONF)");
return 0;
}
ifr = (struct ifreq*)data;
nIntfcs = ifc.ifc_len / sizeof(struct ifreq);
for(int i=0; i < nIntfcs; i++)
{
safe_printf("%s\n", (&ifr[i])->ifr_name);
if (!strcmp((&ifr[i])->ifr_name, name)) {
return 1;
}
}
return 0;
}
当我运行这个函数时,我收到以下输出。
lo0
stf0
�2�>S
en1j
0
此代码在几个月前运行良好。发生了什么变化?我做错了什么吗?
操作系统:OSX El Capitan
最佳答案
SIOCGIFCONF
IOCTL 返回的结构数组在 OSX 中的大小不同。它们将有一个字段 ifr->ifr_addr.sa_len
,每个结构都不同
修改函数来处理这个问题。希望对您有所帮助:
int isValidNDevice(char *name) {
char data[4096];
struct ifconf ifc;
struct ifreq *ifr;
int sk,length;
sk = socket(AF_INET, SOCK_DGRAM, 0);
if(sk < 0)
{
perror("socket");
return 0;
}
ifc.ifc_len = sizeof(data);
ifc.ifc_buf = (caddr_t)data;
if(ioctl(sk, SIOCGIFCONF, &ifc) < 0)
{
perror("ioctl(SIOCGIFCONF)");
return 0;
}
ifr = (struct ifreq*)data;
for(int i=0;i<ifc.ifc_len;)
{
length=IFNAMSIZ + ifr->ifr_addr.sa_len;
printf("%s\n", ifr->ifr_name);
if (!strcmp(ifr->ifr_name,name)) {
printf("Interface Found!\n");
return 1;
}
ifr=(struct ifr*)((char*)ifr+length);
i+=length;
}
return 0;
}
关于c - ifreq 的 ifr_names 不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39458291/