2009-02-11 63 views
1

我試圖訪問61616在我的iPhone應用程序和SCReachability代碼指示,我有一個有效的網絡,但我超時試圖寫入61616有誰知道:iPhone EDGE/3G網絡端口範圍?有人知道嗎?

A.如果iPhone EDGE/3G網絡端口範圍有限,或者不允許連接到此端口?

B.我如何明確檢查是否可以訪問此端口。這是我的「網絡可達」代碼(借用蘋果的例子),它檢查「foo.bar.com」,但不顯示如何檢查「foo.bar.com:61616」。

任何幫助表示讚賞!

- (BOOL)isDataSourceAvailable{ 
static BOOL checkNetwork = YES; 
BOOL _isDataSourceAvailable = NO; 
if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once. 
    checkNetwork = NO; 

    Boolean success;  
    const char *host_name = "foo.bar.com"; 

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); 
    SCNetworkReachabilityFlags flags; 
    success = SCNetworkReachabilityGetFlags(reachability, &flags); 
    _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 
    CFRelease(reachability); 
} 
return _isDataSourceAvailable; 

}

回答

5

SCNetworkReachability API只檢查地址是否可以路由到。引用文檔:

「可達性」反映了一個數據包 ,由應用程序送入 網絡堆棧是否可以離開本地 計算機。請注意,可達性確實不保證數據包 實際上將被主機接收。

這有什麼好做NAT或端口​​限制。路由基於地址 - 不在端口上。所以你可以找到(通過SCNetworkReachability API)是否可以(理論上)達到機器的界面。它不會嘗試在某個端口上建立連接。

因此,要了解該服務是否可到達,您將不得不嘗試自測。最好在SCNetworkReachability API告訴你可以建立連接的時候。只需嘗試通過端口61616連接到服務器並查看是否有連接或超時。適當的超時值和處理在這裏至關重要。

1

如果你的iPhone連接在EDGE /移動,這可能是一個NAT網關後面所以你是無法與之聯繫。至少T-Mobile德國就是這種情況。 iPhone通過T-Mobile(172.16.x.x)獲取RFC IP地址。

我將與連接到本地WiFi網絡與iPhone進行測試 - 如果可能的話 - 一般設計應用程序的方式,iPhone的聯繫人的服務器,然後服務器可以與手機通信。

2

這不僅僅是運營商到運營商,而是從合同到合同的差異很大。例如,在英國,O2在限制互聯網訪問方面僅限於網址(可能是端口80和443,但我沒有檢查)用於即付即用的客戶,但允許爲某人提供或多或少的免費訪問合同。 (我希望這是一個有點更加開放的iPhone現收現付的客戶。)

我認爲這實際結果是,你不能在世界上承擔到處獲得很高的端口。

我不確定是否有一種簡單的方法來檢查特定的端口是否打開,可能您最好的選擇是使用「合理的」超時。當然,有很多原因可能導致超時,所以你的錯誤必須適合模糊。

0

您是否試圖從外部機器與iPhone聯繫?

這可能不起作用。通常GPRS/EDGE/UMTS基礎設施阻止傳入連接。否則,移動用戶可能會收到他沒有請求的不想要的流量。 (想象一下,在接下來的六週裏,每秒鐘有人會ping你的iPhone一次,你會付出代價的......)

解決方法是建立從移動設備到遠程機器的連接,然後讓遠程機器使用交通。