2014-10-20 27 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; 
    } 
} 

和調試後我已經看到,它在第二塊進入,並檢測接口類型無線網絡連接。有人能告訴我如何正確地確定所有網絡接口的類型。

N.B:我在一個C++庫解決方案中使用了上述代碼,這是一個跨平臺庫。

回答

0

此問題已得到解決。發佈它,以便用戶可以獲得幫助。主要問題是我在零地址結構中傳遞NULL。在結構中分配了我的網絡接口地址後,它正確地通過了所有情況並確定了網絡接口類型。

相關問題