[英]How to identify whether the current data network is Edge or 3G on iPhone
[英]iPhone EDGE/3G network port range? Anybody know?
我試圖在我的iPhone應用程序中訪問61616,SCReachability代碼表明我有一個有效的網絡,但是我超時嘗試寫入61616。有人知道:
答:如果iPhone EDGE / 3G網絡的端口范圍有限,或者不允許連接到此端口?
B.如何明確檢查對該端口的訪問。 這是我的“網絡可達”代碼(從Apple的示例中借用),該代碼檢查“ 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;
}
SCNetworkReachability API僅檢查是否可以將地址路由到。 引用文檔:
“可到達性”反映了應用程序發送到網絡堆棧中的數據包是否可以離開本地計算機。 請注意,可達性並不能保證主機將實際接收到數據包。
這與NAT或端口限制無關。 路由基於地址,而不是端口。 因此,您可以發現(通過SCNetworkReachability API)(理論上)是否可以到達計算機的界面。 它不會嘗試在特定端口上建立連接。
因此,要確定該服務是否可用,您必須嘗試進行自我測試。 最好在SCNetworkReachability API告訴您可以建立連接時。 只需嘗試在端口61616上連接到服務器,看看是否獲得連接或超時。 正確的超時值和處理在這里至關重要。
這不僅因承運人而異,而且因合同而異。 例如,在英國O2中,按使用付費的客戶只能將互聯網訪問限制為僅訪問網址(大概是端口80和443,但我沒有檢查),但允許訪問范圍不大的人免費訪問合同。 (我希望它對iPhone PAYG客戶更加開放。)
我認為這樣做的實際結果是,您不能假設您可以訪問世界各地的高端口。
我不確定是否有一種簡單的方法可以檢查特定端口是否打開,可能最好的選擇是使用“合理的”超時時間。 當然,有很多原因可能會導致您超時,因此您的錯誤必須模棱兩可。
如果您的iPhone是通過EDGE / Mobile連接的,則它可能在NAT網關后面,因此您無法與其聯系。 至少T-Mobile德國就是這種情況。 iPhone通過T-Mobile(172.16.xx)獲得RFC IP地址。
我會在連接到本地WiFi網絡的iPhone上進行測試,並且在可能的情況下-通常以iPhone與服務器聯系然后服務器可以與手機通信的方式設計應用程序。
您是否要從外部機器聯系iPhone?
那可能行不通。 通常,GPRS / EDGE / UMTS基礎結構會阻止傳入連接。 否則,可能向移動訂戶收取他未請求的不必要流量的費用。 (想象一下,在接下來的六周里有人每秒對您的iPhone進行一次ping操作。您將為此付費...)
解決方案是建立從移動設備到遠程計算機的連接,然后讓遠程計算機使用該連接進行通信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.