2016-09-12 18 views
7

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

+0

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). –

+0

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

+3

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

Trả lời

1

Các mảng của cấu trúc được trả về bởi các SIOCGIFCONF IOCTL không có cùng kích thước trong OSX. Họ sẽ có một trường ifr->ifr_addr.sa_len sẽ khác nhau đối với mỗi cấu trúc

Chức năng sửa đổi để xử lý việc này. Hy vọng điều này sẽ giúp:

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; 
} 
+0

Cảm ơn bạn đã trả lời! Tôi vẫn muốn biết những gì thay đổi mặc dù. Mã đăng của tôi đã hoạt động tốt một vài tháng trước. – Roecrew

Các vấn đề liên quan