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++ 라이브러리 솔루션에서 사용하고 있습니다.