2012-02-19 24 views
1

約可達許多問題,但沒有人似乎我做的問題... 正如許多例子表明我以這種方式使用的可達性:可達回報舉辦可達即使主機名是不存在的

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

hostReach = [[Reachability reachabilityWithHostName: @"www.google.com"] retain]; 
[hostReach startNotifier]; 
[self updateInterfaceWithReachability: hostReach]; 

這工作得很好。但是,如果我將主機名更改爲不存在的主機名,例如www.nonexistanthostforsure.com,則可達性仍然可以與主機聯繫。現在,閱讀蘋果文檔,我的印象是,可達性無法告訴我主機(服務器)是否在線。在這種情況下,結果是有道理的,但問題是爲什麼要打擾主機名呢?

回答

0

爲什麼使用主機名麻煩呢?

我同意。

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

hostReach = [[Reachability reachabilityForInternetConnection] retain]; 
[hostReach startNotifier]; 
[self updateInterfaceWithReachability: hostReach]; 

Apple Reachability docs狀態:

reachabilityForInternetConnection- checks whether the default route is available. Should be used by applications that do not connect to a particular host

如果您檢查默認路由是否可用,然後查詢您的服務器和連接超時,你仍然可以像顯示「無法行動連接到服務器「消息,而不必針對特定主機名測試可達性。它基本上完成了同樣的事情,除非它更自然,因爲錯誤處理代碼位於輪詢代碼的中間,所以您不必爲它調用全局可達性處理程序。

+0

感謝您的回答。我似乎無法找到可靠的東西來檢查服務器是否在線。我試過: NSURLResponse * response = nil; NSError * error = nil; NSData * data = nil; NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@「http://www.nonexistantserver.com/」]]; data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 但即使這不返回錯誤,返回的數據和響應不是零! 必須有可靠的東西來檢查服務器是否打開。 – user1219880 2012-02-20 01:47:35

+0

有一個更可靠的版本的可達性代碼[here](http://blog.ddg.com/?p=24) – darvids0n 2012-02-20 03:03:48

+0

再次感謝您試圖幫助我。不過,我仍然有同樣的問題。即使您建議的可達性版本也無法滿足我的需求 - 能夠判斷我的服務器是否啓動!並且我發佈在我以前的評論中的代碼也沒有幫助(NSURLConnection),因爲它甚至在我使用非存在的服務器時也不會失敗。任何人都可以幫忙嗎? – user1219880 2012-02-25 18:45:43

0

您是否曾嘗試在該服務器上打開一個TCP/IP普通套接字到端口21?如果成功的話,你就會知道主機的在線....

0

可達只檢查,如果你的主機URL請求可以逃出你的設備到你的路由器,它不會,如果你的請求到達實際的服務器確認

我認爲檢查主機地址可用性的最好方法是檢查NSURL請求的結果。

NSString *url= @"http://google.com"; 
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:reqURL]]; 
NSURLResponse *resp = nil; 
NSError *error = nil; 
NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &error]; 
NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 

使用代碼的此位,如果你的設備無法提供的網址,它提供了一些輸出到錯誤變量,如果它可以訪問URL請求,誤差爲零。

即使您的URL數據包可以從您的設備路由出去,並且永遠不會到達主機服務器,可達性也會給出正面的輸出。