我正在尝试在我的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;
}
答案 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操作。你会为此付出代价......)
解决方案是建立从移动设备到远程计算机的连接,然后让远程计算机将其用于流量。