Платформа доступности не работает нормально при определении типа интерфейса при наличии нескольких сетевых интерфейсов

0

Я использую Reachability framework для определения типа интерфейса. Его работа прекрасна при использовании одного интерфейса. Но когда используется несколько сетевых интерфейсов, он работает ненормально. Это не удается в следующем случае -

Предположим, у вас есть два сетевых интерфейса: один - WiFi и другой сотовый (3G, 2G, EDGE и т.д.). Когда я пытаюсь определить тип интерфейса для каждого из интерфейсов, он возвращает WiFi для каждого случая. Но работает нормально, когда подключены только интерфейсы WiFi или 3G. Я использовал следующий код для определения типа интерфейса -

 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. Может ли кто-нибудь показать мне, как я могу правильно определить весь тип сетевого интерфейса.

NB: Я использую приведенный выше код в библиотечном решении C++, которое представляет собой библиотеку кросс-платформы.

Теги:
reachability

1 ответ

0
Лучший ответ

Эта проблема исправлена. Проводка, чтобы пользователь мог получить помощь. Основная проблема заключалась в том, что я пропускал NULL в структуре zeroAddress. После назначения моего адреса сетевого интерфейса в структуре он правильно передал все случаи и определенный тип сетевого интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню