我正在更新一些出于各种目的而使用硬编码网络iface(eth0
)的软件。我想做的是检测哪个以太网接口是第一个。我了解systemd的更改以及使用新命名方案在这些系统上可能不存在eth0
的情况。因此,我要尝试通过所有接口运行并检测以太网适配器。我想避免使用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和其他可能的其他设备?
请注意,这需要在系统系统和非系统系统上都可以使用,并且我宁愿避免从iface名称(无strncmp(if_name, "eth", 3) == 0
,strncmp(if_name, "en", 2) == 0
和转发排序方式)中推断类型兼容性和手动配置的命名。)