2014-10-20 3 views
0

Reachability 프레임 워크를 사용하여 인터페이스 유형을 감지하고 있습니다. 단일 인터페이스를 사용할 때 제대로 작동합니다. 그러나 여러 개의 네트워크 인터페이스가 사용될 때 비정상적으로 작동합니다. 다음과 같은 경우 실패합니다. -다중 네트워크 인터페이스가있는 경우 인터페이스 유형을 감지하는 동안 도달 가능성 프레임 워크가 올바르게 작동하지 않습니다.

두 개의 네트워크 인터페이스가 있다고 가정합니다. 하나는 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를 감지합니다. 어떤 사람이 모든 네트워크 인터페이스 유형을 올바르게 결정할 수있는 방법을 보여줄 수 있습니까?

N.B : 위의 코드는 크로스 플랫폼 라이브러리 인 C++ 라이브러리 솔루션에서 사용하고 있습니다.

답변

0

이 문제는 해결되었습니다. 사용자가 도움을 얻을 수 있도록 게시하십시오. 주요 문제는 zeroAddress 구조체에 NULL을 전달한다는 것이 었습니다. 구조에 내 네트워크 인터페이스 주소를 할당 한 후 모든 사례를 통과하고 네트워크 인터페이스 유형을 올바르게 결정했습니다.