我试图访问61616在我的iPhone应用程序和SCReachability代码表示我有一个有效的网络,但是我时间想写信给61616.任何人都不会知道:

A.如果iPhone边/3G网络设有一个限于港口范围内或不允许连接到这个港口?

B。我怎么能查明确地访问这个端口。这里是我的"是网络不到"代码(借用了苹果的例子),其检查"foo.bar.com"但是,没有显示如何检查"foo。酒吧。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现收现付的客户。)

我认为这实际结果是,你不能在世界上承担到处获得很高的端口。

我不知道,有一个简单的方法来检查特定的端口是开放的,可能是你最好的选择是使用一个“合理的”超时。当然,也有一些原因,你可能会得到这样的超时你的错误就必须适合含糊。

如果您的iPhone连接在EDGE /移动,这可能是一个NAT网关因此您暂时无法联系其背后。至少,这是与T-Mobile德国的情况。在iPhone得到由T-Mobile的(172.16.x.x)。

的RFC IP地址

我将与连接到本地WiFi网络与iPhone进行测试 - 如果可能的话 - 一般设计应用程序的方式,iPhone的联系人的服务器,然后服务器可以与手机互通。

您试图从外部机器与您的iPhone?

这可能不起作用。通常情况下,GPRS / EDGE / UMTS基础设施阻止传入的连接。否则,移动用户可能需要支付不必要的流量,他没有要求。 (想象一下,有人每秒ping你的iPhone曾经为未来六周。你会付出代价的......)

解决方案是建立从移动设备到远程机器的连接,然后让远程机器使用流量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top