ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mac 网络类型识别

2022-01-27 19:34:05  阅读:198  来源: 互联网

标签:__ bridge name Mac 网络 NSString interface 识别 ref


参考 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

 

标签:__,bridge,name,Mac,网络,NSString,interface,识别,ref
来源: https://www.cnblogs.com/qwj-sysu/p/15851034.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有