当前位置:  开发笔记 > 编程语言 > 正文

在iPhone中使用getaddrinfo

如何解决《在iPhone中使用getaddrinfo》经验,为你挑选了0个好方法。

我准备小申请.当我重新启动iPhone 3G(使用3G互联网连接)并安装此应用程序时,getaddrinfo始终返回EAI_NONAME(8).我关闭应用程序并运行Safari然后运行我的应用程序 - 所有工作.什么问题?

- (void)viewDidLoad {
    [super viewDidLoad];

    const char* hostname = "google.com";

    struct addrinfo hints, *res;
    int retval;

    memset (&hints, 0, sizeof (struct addrinfo));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    retval = getaddrinfo (hostname, NULL, &hints, &res);
    if (retval == 0) {
        freeaddrinfo (res);
    }else if(retval == EAI_NONAME)
    {
        //noname
    }
}

来自Apple的回答:

你好帕维尔,

我正在回应你的发现,尝试使用BSD getaddrinfo功能在尝试获得只能进行无线广域网(WWAN)连接的连接(EDGE,3G)时会出现问题.您遇到的问题是,出于节省电池的原因,WWAN将在不需要网络服务时关闭.接下来的问题是,当需要网络服务时,如何激活WWAN.

官方支持的建立WWAN连接的机制是使用CFSocketStream API(或依赖API - NSSocket,以及CFHTTPStream,CFFTPStream,NSURLRequest和NSURLConnection API).这意味着正式,只支持TCP.此限制会影响所有基于UDP和BSD套接字的应用程序.使用BSD Connect呼叫不会触发iPhone启用WWAN.该限制也适用于在WiFi连接下将导致分组传输的所有其他BSD功能.

但是,在当前的iPhone OS下,一旦建立了WWAN连接,使用BSD套接字和CFSocket功能将使WWAN连接保持活动状态.这使得基于UDP或BSD套接字的应用程序可以通过使用CFSocketStream API与TCP服务器(包括HTTP Web服务器)建立连接来建立WWAN连接.一旦连接处于活动状态,程序就可以像过去一样运行.这就是访问网络服务的Safari,Mail和其他Apple应用程序用于建立连接的方式.因此,当您启动Safari时,启动您的应用程序网络访问工作.使用Safari会导致iPhone建立WWAN连接.当您退出Safari时,WWAN不会自动关闭 - 它会在短时间内保持活动状态.如果启动应用程序,则WWAN服务处于活动状态,只要存在网络活动,您的应用程序将使WWAN保持活动状态.

如果您的应用程序要使用TCP,那么您可以修改代码以使用CFSocketStream或依赖API进行网络连接.当然,如果你有一个完整的BSD套接字功能库,对于想要尽快将应用程序推送到App Store的人来说,这可能不是一个合理的解决方案.

....

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有