首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当存在多个网络接口时,可达性框架在检测接口类型时不能很好地工作。

当存在多个网络接口时,可达性框架在检测接口类型时不能很好地工作。
EN

Stack Overflow用户
提问于 2014-10-20 01:54:21
回答 1查看 299关注 0票数 0

我正在使用Reachability框架来检测接口类型。当使用单界面时,它工作得很好。但是当多个网络接口被使用时,它的工作方式是异常的。在以下情况下失败-

假设您有两个网络接口,一个是WiFi,另一个是蜂窝(3G、2G、EDGE等)。当我试图检测每个接口的接口类型时,它会为每种情况返回WiFi。但是,当只连接WiFi或3G接口时,它工作得很好。我使用了以下代码来检测接口类型-

代码语言:javascript
复制
 static struct sockaddr_in zeroAddress;
 bzero(&zeroAddress, sizeof(zeroAddress));
 zeroAddress.sin_len = sizeof(zeroAddress);
 zeroAddress.sin_family = AF_INET;

 SCNetworkReachabilityFlags flags;

 AFNetworkInterfaceType  interfaceType = AF_NIC_TYPE_UNKNOWN;

 bool reachable = true;

 UserInfo info;

 static SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);


 SCNetworkReachabilityContext context = {0, &info, NULL, NULL, NULL};


 if (SCNetworkReachabilityGetFlags(reachability, &flags))
 {

  if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
  {
   // The target host is not reachable.
   reachable = false;

   if ((flags & kSCNetworkReachabilityFlagsReachable) && (flags & kSCNetworkReachabilityFlagsIsDirect))
   {
    interfaceType = AF_NIC_TYPE_WIFI;
   }
  }

  if ( true == reachable  && (flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
  {
   /*
    If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi...
    */

   interfaceType =  AF_NIC_TYPE_WIFI;

  }


  if ( true == reachable && (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
           (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
  {
   /*
    ... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs...
    */

   if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
   {
    /*
     ... and no [user] intervention is needed...
     */
    interfaceType = AF_NIC_TYPE_WIFI;
   }
  }

  if ( true == reachable && (flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
  {
   /*
    ... but WWAN connections are OK if the calling application is using the CFNetwork APIs.
    */
   interfaceType = AF_NIC_TYPE_CELLULAR;
  }
 }

在调试之后,我看到它进入第二个块并检测接口类型WiFi。有人能告诉我如何正确地确定所有网络接口的类型吗?

注:我在C++库解决方案中使用上述代码,这是一个跨平台库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-02 08:08:12

这个问题已经解决了。张贴它,以便用户可以获得帮助。主要问题是我在zeroAddress结构中传递NULL。在结构中分配了我的网络接口地址后,正确地传递了所有的情况,并正确地确定了网络接口类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26457515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档