Mac 网络类型识别

参考 https://www.jianshu.com/p/6ce77a584a3e ,解决了变量释放的问题,实现版本如下

  • 获取目前使用的网络接口的名称
  • 遍历所有网络接口,找到使用的那一个
  • 判断网络接口的协议和展示明显,判定是有线(ethernet)还是Wi-Fi
复制代码
void GetNetworkTyep(std::string& network_type) {
  NSString *use_interface = @"";
  {
    SCDynamicStoreRef ds = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("myApplication"), NULL, NULL);
    // ipv6
    CFPropertyListRef dr6 = SCDynamicStoreCopyValue(ds, CFSTR("State:/Network/Global/IPv6"));
    // ipv4
    CFPropertyListRef dr4 = SCDynamicStoreCopyValue(ds, CFSTR("State:/Network/Global/IPv4"));
    
    if (dr6) {
      use_interface = [(NSDictionary *)CFBridgingRelease(dr6) valueForKey:@"PrimaryInterface"];
    } else if(dr4) {
      use_interface = [(NSDictionary *)CFBridgingRelease(dr4) valueForKey:@"PrimaryInterface"];
    }
    
    CFRelease(ds);
  }
  
  CFArrayRef ref = SCNetworkInterfaceCopyAll();
  
  for(id item in (__bridge NSArray *)(ref)) {
    SCNetworkInterfaceRef interface_ref = (__bridge SCNetworkInterfaceRef)(item);
    // for example : Wi-Fi || AX88772A
    CFStringRef display_name = SCNetworkInterfaceGetLocalizedDisplayName(interface_ref);
    // for example : Ethernet || IEEE80211 || Bridge
    CFStringRef interface_name = SCNetworkInterfaceGetInterfaceType(interface_ref);
    // for example : en[0-9] bridge[0-9]
    CFStringRef bsd_name = SCNetworkInterfaceGetBSDName(interface_ref);
    NSString *name = [NSString stringWithString:(__bridge NSString *)display_name];
    NSString *interface = [NSString stringWithString:(__bridge NSString *)interface_name];
    NSString *bsd = [NSString stringWithString:(__bridge NSString *)bsd_name];
    if ([bsd isEqualToString:use_interface]) {
      if ([interface containsString:@"Ethernet"]) {
        network_type = "Ethernet";
      } else if ([interface containsString:@"802"] || [name containsString:@"Wi-Fi"]) {
        network_type = "Wi-Fi";
      }
    }
    blog(LOG_INFO, "network type :%s*%s*%s %s", name.UTF8String, interface.UTF8String, bsd.UTF8String, network_type.c_str());
  }
  
  CFRelease(ref);
}
复制代码

p

 

posted @   2BiTT  阅读(310)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2015-01-27 django “如何”系列7:错误汇报
2015-01-27 django “如何”系列6:如何部署django
2015-01-27 django “如何”系列5:如何编写自定义存储系统
点击右上角即可分享
微信分享提示