以下函数确定给定字符串是否为有效的网络设备名称.
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;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此功能时,我收到以下输出.
lo0的
stf0
2>取值
en1j
0
几个月前,这段代码运行良好.发生了什么变化?我做错了什么吗?
操作系统:OSX El Capitan
小智 2
IOCTL返回的结构数组SIOCGIFCONF
在 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;
}
Run Code Online (Sandbox Code Playgroud)