Я использую 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++, которое представляет собой библиотеку кросс-платформы.
Эта проблема исправлена. Проводка, чтобы пользователь мог получить помощь. Основная проблема заключалась в том, что я пропускал NULL в структуре zeroAddress. После назначения моего адреса сетевого интерфейса в структуре он правильно передал все случаи и определенный тип сетевого интерфейса.