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

时间:2019-01-23 22:11:23

标签: c linux network-programming

我正在更新一些出于各种目的而使用硬编码网络iface(eth0)的软件。我想做的是检测哪个以太网接口是第一个。我了解systemd的更改以及使用新命名方案在这些系统上可能不存在eth0的情况。因此,我要尝试通过所有接口运行并检测以太网适配器。我想避免使用lotun和其他虚拟设备。到目前为止,使用此代码效果很好:

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和其他可能的其他设备?

请注意,这需要在系统系统和非系统系统上都可以使用,并且我宁愿避免从iface名称(无strncmp(if_name, "eth", 3) == 0strncmp(if_name, "en", 2) == 0和转发排序方式)中推断类型兼容性和手动配置的命名。)

0 个答案:

没有答案