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

标签 macos cocoa

我正在尝试获取具有最终用户可理解名称的事件网络接口(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/42166518/

相关文章:

macos - 如何让 Atom 成为我的默认编辑器?

xcode - 复制通用NSPasteboard的完整内容

objective-c - 从 NSImage 对象获取最高位图表示的最佳方法是什么

c# - 使用 Xamarin.Mac 禁用耦合到 socket 的 NSMenuItem

linux - 人类可读形式的时间戳

swift - 在文件名中插入一个字符

objective-c - 旋转、更改颜色并从 NSImage 获取 RGB565 数据

cocoa - 在单个 View 中开发多个面板

ios - IOS 应用程序的图像显示选项

objective-c - 如何追踪这些崩溃?