gpt4 book ai didi

macos - 转换网络接口(interface)名称

转载 作者:行者123 更新时间:2023-12-03 17:01:39 25 4
gpt4 key购买 nike

我正在尝试获取具有最终用户可理解名称的事件网络接口(interface)列表。就像系统偏好设置中列出的名称而不是 en0 en5

我有使用 getifaddrs 的原始接口(interface)但一直无法找到如何获取这些并获取 Ethernet 的系统名称或Wifi .

有人知道该怎么做吗?这适用于 macOS。

我现在拥有的:

    struct ifaddrs *ifap;
if( getifaddrs(&ifap) == 0 ){
struct ifaddrs *interface;

for (interface = ifap; interface != NULL; interface = interface->ifa_next) {
unsigned int flags = interface->ifa_flags;
struct sockaddr *addr = interface->ifa_addr;

// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) {
if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {

// Convert interface address to a human readable string:
char host[NI_MAXHOST];
getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);

printf("interface:%s, address:%s\n", interface->ifa_name, host);
// MAGIC HERE TO CONVERT ifa_name to "Ethernet" or something
}

}
}
freeifaddrs(ifap);

最佳答案

这可以通过 macOS 上的系统配置实现。在 Objective-C 中像这样:

    CFArrayRef ref = SCNetworkInterfaceCopyAll();
NSArray* networkInterfaces = (__bridge NSArray *)(ref);
for(int i = 0; i < networkInterfaces.count; i += 1) {
SCNetworkInterfaceRef interface = (__bridge SCNetworkInterfaceRef)(networkInterfaces[i]);

CFStringRef displayName = SCNetworkInterfaceGetLocalizedDisplayName(interface);
CFStringRef bsdName = SCNetworkInterfaceGetBSDName(interface);
NSLog(@"Name:%@ \ninterface: %@\nbsd:%@",displayName, SCNetworkInterfaceGetInterfaceType(interface), bsdName);

}

本地化显示名称将类似于显示以太网WiFi,BSD名称将类似于en5,这将允许匹配上面的代码。

这种方法在 iOS 上不起作用,但 iOS 上确实没有任何其他配置。

关于macos - 转换网络接口(interface)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40727807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com