iPhone EDGE / 3G网络端口范围?有人知道吗?

时间:2009-02-11 23:08:26

标签: iphone networking sockets asyncsocket

我正在尝试在我的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;

}

4 个答案:

答案 0 :(得分:5)

SCNetworkReachability API仅检查地址是否可以路由到。引用文档:

  

“可达性”反映是否有数据   数据包,由应用程序发送到   网络堆栈,可以离开本地   电脑。请注意,可达性确实如此   不保证数据包   实际上会被主持人收到。

这与NAT或端口​​限制无关。路由基于地址 - 而不是端口。所以你能找到的(通过SCNetworkReachability API)是否(理论上​​)可以到达机器的界面。它不会尝试在某个端口上建立连接。

因此,为了确定该服务是否可以访问,您必须尝试自己测试。最好在SCNetworkReachability API告诉您可以建立连接时。只需尝试连接到端口61616上的服务器,看看是否有连接或超时。适当的超时值和处理在这里至关重要。

答案 1 :(得分:2)

这不仅仅是从承运人到承运人,而是从合同到合同的变化很大。例如,在英国O2限制互联网访问仅限于网址(可能是端口80和443,但我没有检查),适用于即付即用的客户,但允许一个人或多或少的免费访问合同。 (我希望对iPhone PAYG客户来说更开放。)

我认为这样做的实际结果是你不能假设访问世界各地的高端口。

我不确定是否有一种简单的方法来检查特定端口是否打开,可能最好的选择是使用“合理”的超时。当然,有很多原因可能会导致超时,因此您的错误必须模糊不清。

答案 2 :(得分:1)

如果您的iPhone通过EDGE / Mobile连接,它可能在NAT网关后面,因此您无法联系它。至少T-Mobile德国就属于这种情况。 iPhone通过T-Mobile(172.16.x.x)获取RFC IP地址。

我会用连接到本地WiFi网络的iPhone进行测试,并且 - 如果可能的话 - 通常以iPhone与服务器联系的方式设计应用程序,然后服务器就可以与手机通信。

答案 3 :(得分:0)

您是否尝试通过外部设备联系iPhone?

这可能不起作用。通常,GPRS / EDGE / UMTS基础设施会阻止传入连接。否则,可以向移动用户收取他未请求的不需要的流量的费用。 (想象一下,有人会在接下来的六周内每秒对你的iPhone进行一次ping操作。你会为此付出代价......)

解决方案是建立从移动设备到远程计算机的连接,然后让远程计算机将其用于流量。