我准备小申请。当我重新启动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
    }
}

苹果公司的答案:

你好帕维尔,

我正在回答有关您的发现,当尝试建立只能建立无线广域网(WWAN)连接(EDGE,3G)的连接时,尝试使用BSD getaddrinfo函数是有问题的。您遇到的问题是,出于节电的原因,当不需要网络服务时,WWAN将关闭。问题就变成了在需要网络服务时如何激活WWAN。

建立WWAN连接的官方支持机制是使用CFSocketStream API(或从属API-NSSocket,以及CFHTTPStream,CFFTPStream,NSURLRequest和NSURLConnection API)。这意味着正式仅支持TCP。此限制影响所有基于UDP和BSD套接字的应用程序。使用BSD Connect调用不会触发iPhone启用WWAN。此限制也适用于所有其他BSD功能,这些功能在WiFi连接下会导致数据包传输。

但是,在当前的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的人来说,这可能不是一个合理的解决方案。

....

最佳答案

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

看一看CFHost,这是在iPhone上获取此类信息的首选方式。它支持异步回调,以便在信息可用时通知您,也可以根据需要进行同步调用。

关于iphone - iPhone中的getaddrinfo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1238934/

10-08 21:14