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