Chức năng sau xác định nếu một chuỗi đã cho là tên thiết bị mạng hợp lệ.ifr_names ifreq không chính xác?
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;
}
Khi tôi chạy chức năng này, tôi nhận được kết quả như sau.
lo0
stf0
2> S
en1j
Mã này hoạt động tốt cách đây vài tháng. Điều gì đã thay đổi? Tôi đang làm điều gì đó không chính xác?
OS: OSX El Capitan
Ah, do đó, đó là Mac OS. Bởi vì đối với Linux mã của bạn là chính xác, nhưng máy Mac khác nhau, bạn có thấy [mã này] (https://gist.github.com/OrangeTide/909204) (dòng 57-63) không? Mặc dù có lẽ nó dễ dàng hơn để chỉ sử dụng 'getifaddrs()' hoặc thậm chí 'if_nameindex()' (không chắc chắn cái cuối cùng được hỗ trợ trên Mac OS). –
Bạn có thể bao gồm một chương trình tối thiểu nhưng hoàn chỉnh để biên dịch và chạy và trưng bày sự cố của bạn không? Bạn sẽ có cơ hội tốt hơn để được giúp đỡ. Ngoài ra, hãy xem http://stackoverflow.com/help/mcve – sigjuice
nIntfcs = ifc.ifc_len/sizeof (struct ifreq) không hợp lệ trên OS X vì ifreqs trả về không phải là tất cả cùng kích thước như Linux. Đề cập đến mã [ifconfig] của Apple (https://opensource.apple.com/source/network_cmds/network_cmds-306/ifconfig.tproj/ifconfig.c) có thể hữu ích. – sigjuice