c - ifreq 的 ifr_names 不正确?

标签 c macos sockets

以下函数确定给定字符串是否为有效的网络设备名称。


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/

相关文章:

更改数组中的元素值未正确反射(reflect)

C vector/数组列表/链表

c++ - 用于创建/注册虚拟存储设备的 IOKit 驱动程序

python - 套接字.gaierror : [Errno -2] Name or service not known with Python3

C/如何监听多个UDP端口

c - C POSIX进程管道/套接字通信练习第二个进程被卡住

macos - 通过Mac Terminal上传文件夹

macos - 如何在随机森林示例中生成文件描述符?

C - 创建一个 sockaddr 结构

c++ - 内存寻址与数组的混淆