代码之家  ›  专栏  ›  技术社区  ›  Genericrich

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

  •  1
  • Genericrich  · 技术社区  · 17 年前

    我试图在iPhone应用程序中访问61616,SCReachability代码表明我有一个有效的网络,但我尝试写入61616时超时。有谁知道:

    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;
    

    }

    4 回复  |  直到 17 年前
        1
  •  5
  •   tcurdt    17 年前

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

    “可达性”反映了数据 数据包,由应用程序发送到 网络栈,可以离开本地 不保证数据包 将实际由主机接收。

    这与NAT或端口限制无关。路由基于地址,而不是端口。因此(通过SCNetworkReachabilityAPI)您所能发现的就是(理论上)是否能够到达机器的接口。它不会尝试在某个端口上建立连接。

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

        2
  •  2
  •   Stephen Darlington    17 年前

    这是一件变化很大的事情,不仅是承运人之间的承运人,但从合同到合同。例如,在英国,O2仅对按量付费客户的web地址(可能是端口80和443,但我没有检查)进行互联网访问限制,但允许合同中的人员或多或少地免费访问。(我希望它对iphonepayg客户更开放一些。)

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

        3
  •  1
  •   Dirk Taggesell Dirk Taggesell    17 年前

    如果您的iPhone通过EDGE/Mobile连接,它可能位于NAT网关后面,因此您无法与之联系。至少德国的T-Mobile就是这样。iPhone通过T-Mobile(172.16.x.x)获得RFC IP地址。

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

        4
  •  0
  •   Bernd Bernd    17 年前

    这可能行不通。通常,GPRS/EDGE/UMTS基础设施会阻止传入连接。否则,移动用户可能会因其未请求的不必要流量而付费。(想象有人在接下来的六周内每秒敲打你的iPhone一次,你会为此付出代价的……)

    解决方案是建立从移动设备到远程机器的连接,然后让远程机器使用该连接进行通信。