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/

相关文章:

linux - 从内核空间中给定的结构套接字获取结构文件

c - 定义函数指针的正确方法

c - 如何尽可能调整函数的返回值(在 AS3 和 C 中)

ios - macOS 应用程序崩溃并且不提示相机权限

macos - 奇怪的 Android 模拟器和 Mac 的点击灵敏度问题

Java swing GUI 卡住

c - 如何在同时使用另一个循环的同时使用循环递增变量?

C 编程(GPA 计算器)

php - MAC Excel 使用什么编码?

python - 我的服务器(Python套接字)有什么问题?