NetworkReachable學習

轉載自:http://dev.10086.cn/cmdn/bbs/thread-12475-1-1.html

一.基本知識


在需要聯網的iPhone程序中,我們首先需要檢查網絡的狀態,如果不能連接網絡則告訴用戶程序不能使用的原因是沒有網絡連接。在iPhone的SystemConfiguration框架裏有提供了和聯網相關的函數,可以用來檢查網絡的連接狀態


二.具體介紹


1.SCNetworkReachability介紹


SystemConfiguration框架中和測試網絡連接狀態相關的函數定義在SCNetworkReachability.H文件中,主要的函數有以下幾個


(1)創建測試連接的引用


(a)SCNetworkReachabilityRef SCNetworkReachabilityCreateWithAddress (


   CFAllocatorRef allocator,


   const struct sockaddr *address


);


根據傳入的地址測試連接,第一個參數可以爲NULL或kCFAllocatorDefault,第二個參數爲需要測試連接的IP地址,當爲0.0.0.0時則可以查詢本機的網絡連接狀態。同時返回一個引用必須在用完後釋放。


(b)SCNetworkReachabilityRef SCNetworkReachabilityCreateWithName (


   CFAllocatorRef allocator,


   const char *nodename


);


這個是根據傳入的網址測試連接,第二個參數比如爲"www.apple.com",其他和上一個一樣。


(2)確定連接的狀態:


Boolean SCNetworkReachabilityGetFlags (


   SCNetworkReachabilityRef target,


   SCNetworkReachabilityFlags *flags


);


這個函數用來獲得測試連接的狀態,第一個參數爲之前建立的測試連接的引用,第二個參數用來保存獲得的狀態,如果能獲得狀態則返回TRUE,否則返回FALSE


(3)主要的數據類型介紹:


SCNetworkReachabilityRef:用來保存創建測試連接返回的引用


(4)主要常量介紹


SCNetworkReachabilityFlags:保存返回的測試連接狀態


其中常用的狀態有:


kSCNetworkReachabilityFlagsReachable:能夠連接網絡


kSCNetworkReachabilityFlagsConnectionRequired:能夠連接網絡,但是首先得建立連接過程


kSCNetworkReachabilityFlagsIsWWAN:判斷是否通過蜂窩網覆蓋的連接,比如EDGE,GPRS或者目前的3G.主要是區別通過WiFi的連接。


2.代碼例子


因此判斷是否已經聯網的代碼例子可以如下所示:


+ (BOOL) connectedToNetwork


{



//創建零地址,0.0.0.0的地址表示查詢本機的網絡連接狀態



struct sockaddr_in zeroAddress;



bzero(&zeroAddress, sizeof(zeroAddress));



zeroAddress.sin_len = sizeof(zeroAddress);



zeroAddress.sin_family = AF_INET;





// Recover reachability flags



SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);



SCNetworkReachabilityFlags flags;



//獲得連接的標誌



BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);



CFRelease(defaultRouteReachability);



//如果不能獲取連接標誌,則不能連接網絡,直接返回



if (!didRetrieveFlags)



{




return NO;



}



//根據獲得的連接標誌進行判斷



BOOL isReachable = flags & kSCNetworkFlagsReachable;



BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;



return (isReachable && !needsConnection) ? YES : NO;


}

發佈了21 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章