iPhone EDGE/3G网络端口范围?有人知道吗?
我试图访问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;
}
SCNetworkReachability API只检查地址是否可以路由到。引用文档:
“可达性”反映了一个数据包 ,由应用程序送入 网络堆栈是否可以离开本地 计算机。请注意,可达性确实不保证数据包 实际上将被主机接收。
这有什么好做NAT或端口限制。路由基于地址 - 不在端口上。所以你可以找到(通过SCNetworkReachability API)是否可以(理论上)达到机器的界面。它不会尝试在某个端口上建立连接。
因此,要了解该服务是否可到达,您将不得不尝试自测。最好在SCNetworkReachability API告诉你可以建立连接的时候。只需尝试通过端口61616连接到服务器并查看是否有连接或超时。适当的超时值和处理在这里至关重要。
如果你的iPhone连接在EDGE /移动,这可能是一个NAT网关后面所以你是无法与之联系。至少T-Mobile德国就是这种情况。 iPhone通过T-Mobile(172.16.x.x)获取RFC IP地址。
我将与连接到本地WiFi网络与iPhone进行测试 - 如果可能的话 - 一般设计应用程序的方式,iPhone的联系人的服务器,然后服务器可以与手机通信。
这不仅仅是运营商到运营商,而是从合同到合同的差异很大。例如,在英国,O2在限制互联网访问方面仅限于网址(可能是端口80和443,但我没有检查)用于即付即用的客户,但允许为某人提供或多或少的免费访问合同。 (我希望这是一个有点更加开放的iPhone现收现付的客户。)
我认为这实际结果是,你不能在世界上承担到处获得很高的端口。
我不确定是否有一种简单的方法来检查特定的端口是否打开,可能您最好的选择是使用“合理的”超时。当然,有很多原因可能导致超时,所以你的错误必须适合模糊。
您是否试图从外部机器与iPhone联系?
这可能不起作用。通常GPRS/EDGE/UMTS基础设施阻止传入连接。否则,移动用户可能会收到他没有请求的不想要的流量。 (想象一下,在接下来的六周里,每秒钟有人会ping你的iPhone一次,你会付出代价的......)
解决方法是建立从移动设备到远程机器的连接,然后让远程机器使用交通。