代码之家  ›  专栏  ›  技术社区  ›  Cinder Biscuits

如何使用C来识别GNU/Linux上的以太网适配器

  •  2
  • Cinder Biscuits  · 技术社区  · 6 年前

    我正在更新一些使用硬编码网络的软件( eth0 )为了各种目的。我想做的是先检测哪个以太网接口。我了解systemd的变化以及如何 小精灵 使用新命名方案的这些系统很可能不存在。所以我要做的是运行所有接口并检测以太网适配器。我想避免 lo , tun 以及其他虚拟设备。到目前为止,这个代码还不错:

    char* getMainEthernetIfaceName() {
        char *name = NULL;
        struct if_nameindex *ifacenames = if_nameindex(), *idx;
    
        if (!ifacenames) return name;
    
        for (idx = ifacenames; !(!idx->if_index && !idx->if_name); ++idx) {
            char path[256];
            sprintf(path,"/sys/class/net/%s/type", idx->if_name);
            FILE *fp = fopen(path, "re");
            if (fp) {
                int type;
                if (fscanf(fp, "%d", &type) == 1) {
                    if (type == ARPHRD_ETHER) {
                        name = malloc(IF_NAMESIZE);
                        strncpy(name, idx->if_name, IF_NAMESIZE-1);
    
                        fclose(fp);
                        break;
                    }
                }
                fclose(fp);
            }
        }
    
        if_freenameindex(ifacenames);
        return name;
    }
    

    但是,我的测试仍然检测到 pan0 因为它的类型是 ARPHRD_ETHER .

    问题的第一部分,使用 sysfs 要将其识别为以太网设备?

    第二部分,如果是的话,当我只需要以太网适配器时,我如何排除蓝牙PAN和其他潜在设备的选择?

    请注意,这需要同时在systemd和non-systemd系统上工作,我宁愿避免从iface名称推断类型(no strncmp(if_name, "eth", 3) == 0 , strncmp(if_name, "en", 2) == 0 以及转发兼容性和手动配置命名的排序。

    0 回复  |  直到 6 年前