int main (int argc, const char * argv[]) { SCNetworkReachabilityRef r = SCNetworkReachabilityCreateWithName(NULL, "api.del.icio.us"); if(r == NULL) { printf("Error creating reachability reference.\n"); goto bail; } if(!SCNetworkReachabilitySetCallback(r, my_SCNetworkReachabilityCallBack, NULL)) { printf("Unable to set reachability callback\n"); goto bail; } if(!SCNetworkReachabilityScheduleWithRunLoop(r, CFRunLoopGetCurrent(), kCFRunLoopCommonModes)) { printf("Unable to schedule run loop monitoring on run loop.\n"); goto bail; } printf("Starting run loop. Enable and disable network interfaces to fire the callback.\n"); CFRunLoopRun(); printf("Run loop stopped\n"); bail: if(r) CFRelease(r); return 0; }
void KprNetworkInterfaceSetup() { #if TARGET_OS_IPHONE struct sockaddr_in localWifiAddress; SCNetworkReachabilityContext context = {0, NULL, NULL, NULL, NULL}; SCNetworkReachabilityFlags flags; bzero(&localWifiAddress, sizeof(localWifiAddress)); localWifiAddress.sin_len = sizeof(localWifiAddress); localWifiAddress.sin_family = AF_INET; localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); // IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0 gNetworkInterfaceReachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&localWifiAddress); SCNetworkReachabilitySetCallback(gNetworkInterfaceReachability, KprNetworkInterfaceReachabilityCallback, &context); SCNetworkReachabilityScheduleWithRunLoop(gNetworkInterfaceReachability, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); SCNetworkReachabilityGetFlags(gNetworkInterfaceReachability, &flags); KprNetworkInterfaceReachabilityCallback(gNetworkInterfaceReachability, flags, NULL); #elif TARGET_OS_MAC FskErr err = kFskErrNone; SCDynamicStoreContext context = {0, NULL, NULL, NULL, NULL}; CFStringRef pattern = NULL; CFArrayRef patternList = NULL; pattern = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetIPv4); if (!pattern) { err = kFskErrOperationFailed; goto bail; } patternList = CFArrayCreate(NULL, (const void **)&pattern, 1, &kCFTypeArrayCallBacks); if (!patternList) { err = kFskErrOperationFailed; goto bail; } gNetworkInterfaceStore = SCDynamicStoreCreate(NULL, CFSTR("KprNetWorkInterface"), KprNetworkInterfaceStoreCallback, &context); if (!gNetworkInterfaceStore) { err = kFskErrOperationFailed; goto bail; } if (!SCDynamicStoreSetNotificationKeys(gNetworkInterfaceStore, NULL, patternList)) { err = kFskErrOperationFailed; goto bail; } gNetworkInterfaceSource = SCDynamicStoreCreateRunLoopSource(NULL, gNetworkInterfaceStore, 0); if (!gNetworkInterfaceSource) { err = kFskErrOperationFailed; goto bail; } CFRunLoopAddSource(CFRunLoopGetCurrent(), gNetworkInterfaceSource, kCFRunLoopCommonModes); KprNetworkInterfaceStoreCallback(gNetworkInterfaceStore, NULL, NULL); bail: if (err != noErr) { if (gNetworkInterfaceSource) { CFRelease(gNetworkInterfaceSource); gNetworkInterfaceSource = NULL; } if (gNetworkInterfaceStore) { CFRelease(gNetworkInterfaceStore); gNetworkInterfaceStore = NULL; } } if (patternList) CFRelease(patternList); if (pattern) CFRelease(pattern); #elif TARGET_OS_WIN32 NETIOAPI_API status = NotifyIpInterfaceChange(AF_INET, &KprNetworkInterfaceCallback, NULL, TRUE, &gNetworkInterfaceHandle); #elif TARGET_OS_KPL #ifdef KPR_CONFIG KplNetInterfaceInitialize(); KplNetInterfaceSetChangedCallback(KprNetworkInterfaceCallback, 0L); KprNetworkInterfaceCallback(0); #endif #endif }
/* extern */ void _CFTypeInvalidate(CFTypeRef obj) { CFTypeID t = CFGetTypeID(obj); /* Invalidate according to type of object. */ if (t == CFRunLoopSourceGetTypeID()) { CFRunLoopSourceInvalidate((CFRunLoopSourceRef)obj); } else if (t == CFMachPortGetTypeID()) { CFMachPortInvalidate((CFMachPortRef)obj); } else if (t == CFSocketGetTypeID()) { CFSocketInvalidate((CFSocketRef)obj); } /* For scheduled types of objects, it is invalidated by setting the client to NULL. */ else if (t == CFReadStreamGetTypeID()) { CFReadStreamSetClient((CFReadStreamRef)obj, kCFStreamEventNone, NULL, NULL); } else if (t == CFWriteStreamGetTypeID()) { CFWriteStreamSetClient((CFWriteStreamRef)obj, kCFStreamEventNone, NULL, NULL); } else if (t == CFHostGetTypeID()) { CFHostSetClient((CFHostRef)obj, NULL, NULL); } else if (t == SCNetworkReachabilityGetTypeID()) { SCNetworkReachabilitySetCallback((SCNetworkReachabilityRef)obj, NULL, NULL); } else if (t == CFRunLoopTimerGetTypeID()) { CFRunLoopTimerInvalidate((CFRunLoopTimerRef)obj); } else if (t == CFNetServiceGetTypeID()) { CFNetServiceSetClient((CFNetServiceRef)obj, NULL, NULL); } else if (t == CFNetServiceBrowserGetTypeID()) { CFNetServiceBrowserInvalidate((CFNetServiceBrowserRef)obj); } else if (t == CFNetServiceMonitorGetTypeID()) { CFNetServiceMonitorInvalidate((CFNetServiceMonitorRef)obj); } else if (t == SCNetworkReachabilityGetTypeID()) { SCNetworkConnectionStop((SCNetworkConnectionRef)obj, FALSE); } }
static void installIOSNetworkInterfaceChangeTracker() { struct sockaddr_in localWifiAddress; bzero(&localWifiAddress, sizeof(localWifiAddress)); localWifiAddress.sin_len = sizeof(localWifiAddress); localWifiAddress.sin_family = AF_INET; // IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0. localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)&localWifiAddress); if (SCNetworkReachabilitySetCallback(reachability, ReachabilityCallback, NULL)) (void)SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); }
void SCNetworkEventPublisher::addTarget( const SCNetworkSubscriptionContextRef& sc, const SCNetworkReachabilityRef& target) { targets_.push_back(target); // Assign a context (the subscription context) to the target. SCNetworkReachabilityContext* context = new SCNetworkReachabilityContext(); context->info = (void*)≻ context->retain = nullptr; context->release = nullptr; contexts_.push_back(context); SCNetworkReachabilitySetCallback( target, SCNetworkEventPublisher::Callback, context); }
static void ptr_query_stop() { if (ptrTarget == NULL) { return; } my_log(LOG_INFO, "NetBIOS name: ptr query stop"); SCNetworkReachabilitySetCallback(ptrTarget, NULL, NULL); SCNetworkReachabilityUnscheduleFromRunLoop(ptrTarget, rl, kCFRunLoopDefaultMode); CFRelease(ptrTarget); ptrTarget = NULL; return; }
static Boolean ptr_query_start(CFStringRef address) { union { struct sockaddr sa; struct sockaddr_in sin; struct sockaddr_in6 sin6; } addr; char buf[64]; CFDataRef data; CFMutableDictionaryRef options; if (_SC_cfstring_to_cstring(address, buf, sizeof(buf), kCFStringEncodingASCII) == NULL) { my_log(LOG_ERR, "could not convert [primary] address string"); return FALSE; } if (_SC_string_to_sockaddr(buf, AF_UNSPEC, (void *)&addr, sizeof(addr)) == NULL) { my_log(LOG_ERR, "could not convert [primary] address"); return FALSE; } options = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); data = CFDataCreate(NULL, (const UInt8 *)&addr.sa, addr.sa.sa_len); CFDictionarySetValue(options, kSCNetworkReachabilityOptionPTRAddress, data); CFRelease(data); ptrTarget = SCNetworkReachabilityCreateWithOptions(NULL, options); CFRelease(options); if (ptrTarget == NULL) { my_log(LOG_ERR, "could not resolve [primary] address"); return FALSE; } my_log(LOG_INFO, "NetBIOS name: ptr query start"); (void) SCNetworkReachabilitySetCallback(ptrTarget, ptr_query_callback, NULL); (void) SCNetworkReachabilityScheduleWithRunLoop(ptrTarget, rl, kCFRunLoopDefaultMode); return TRUE; }
lastfm::InternetConnectionMonitor::InternetConnectionMonitor( QObject *parent ) : QObject( parent ) , m_up( true ) { #ifdef __APPLE__ if (monitors.isEmpty()) { SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName( NULL, LASTFM_WS_HOSTNAME ); SCNetworkReachabilityScheduleWithRunLoop( ref, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode ); SCNetworkReachabilitySetCallback( ref, callback, NULL ); CFRelease( ref ); } QPointer<InternetConnectionMonitor> p = this; monitors += p; #endif #ifdef WIN32 m_ndisEventsProxy = new NdisEventsProxy(this); m_ndisEventsProxy->registerForNdisEvents(); #endif }
int ServerMain() { // Reachability struct sockaddr_in address; bzero(&address, sizeof(address)); address.sin_len = sizeof(address); address.sin_family = AF_INET; reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &address); if(!SCNetworkReachabilitySetCallback(reachability, &ReachabilityCallback, NULL)) return EXIT_FAILURE; if(!SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetCurrent(), kCFRunLoopCommonModes)) return EXIT_FAILURE; { SCNetworkReachabilityFlags flags; SCNetworkReachabilityGetFlags(reachability, &flags); ReachabilityCallback(reachability, flags, NULL); } // CFMessagePort CFMessagePortRef localPort = CFMessagePortCreateLocal(nil, kServerPortName, &IPCCallback, nil, nil); CFRunLoopSourceRef runLoopSource = CFMessagePortCreateRunLoopSource(nil, localPort, 0); CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); CFRunLoopRun(); CFRunLoopRemoveSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); CFRelease(runLoopSource); CFRelease(localPort); CFRelease(reachability); return 0; }