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++庫解決方案中使用了上述代碼,這是一個跨平臺庫。