首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone中的getaddrinfo

iPhone中的getaddrinfo
EN

Stack Overflow用户
提问于 2009-08-06 13:35:34
回答 1查看 4.4K关注 0票数 5

我准备了一份小申请。当我重新启动我的iPhone 3G (带有3G互联网连接)并安装这个应用程序时,getaddrinfo()总是返回EAI_NONAME (8)。我关闭应用程序并运行Safari,然后运行我的应用程序-所有工作。有什么问题吗?

代码语言:javascript
复制
- (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
    }
}

苹果的答案:

你好帕维尔 对于您的发现,当试图获得只有无线广域网(WWAN)连接可能的连接(EDGE,3G)时,尝试使用BSD getaddrinfo功能是有问题的。您遇到的问题是,出于节省电池的原因,当不需要网络服务时,WWAN将关闭。接下来的问题是,当需要网络服务时,如何激活WWAN。 官方支持的建立WWAN连接的机制是使用CFSocketStream API (或依赖的API - NSSocket以及CFHTTPStream、CFFTPStream、NSURLRequest和NSURLConnection API)。这意味着,官方只支持TCP。这一限制影响到所有基于UDP和BSD套接字的应用程序。使用调用不会触发启用iPhone的WWAN。此限制也适用于在WiFi连接下将导致分组传输的所有其他BSD函数。 但是,在当前的iPhone操作系统下,一旦建立了WWAN连接,使用BSD套接字和CFSocket函数将使WWAN连接保持活动状态。这使得基于UDP或BSD套接字的应用程序能够通过使用CFSocketStream API建立与TCP (包括HTTP服务器)的连接来建立WWAN连接。一旦连接处于活动状态,那么程序就可以像过去那样工作了。这就是访问网络服务的Safari、Mail和其他Apple应用程序用来建立它们的连接的工具。因此,在启动Safari时,启动应用程序网络访问是可行的。使用Safari会使iPhone建立WWAN连接。当您退出Safari时,WWAN不会自动关闭--它会在短时间内保持活动状态。如果启动应用程序,则WWAN服务是活动的,并且只要存在网络活动,应用程序就会使WWAN保持活动状态。 如果您的应用程序使用TCP进行网络连接,那么您可以修改代码以使用CFSocketStream或依赖的API进行网络连接。当然,如果您有一个完整的BSD套接字功能库,这可能不是一个合理的解决方案,谁想让他们的应用程序商店真的很快。 ……

EN

回答 1

Stack Overflow用户

发布于 2009-08-06 14:44:47

这里可能发生的情况是,getaddrinfo()没有阻止等待DNS查找,这可能是一件好事,因为iPhone上的DNS查找可能需要很长时间。一旦你在其他地方做了查找,它就会给你缓存的答案。

看看CFHost,这是在iPhone上获取这类信息的首选方法。它支持异步回调,让您知道何时信息可用,或者您可以进行同步调用,如果您愿意的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1238934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档