我准备小申请。当我重新启动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的回答:
你好Pavel,
我正在回应你的发现,尝试使用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上的人来说,这可能不是一个合理的解决方案。
...
答案 0 :(得分:1)
这里可能发生的是getaddrinfo()
没有阻止等待DNS查找,这可能是一件好事,因为iPhone上的DNS查找可能需要很长时间。一旦你在其他地方完成了查找,它就会给你缓存的答案。
看看CFHost,这是在iPhone上获取此类信息的首选方式。它支持异步回调,让您知道信息何时可用,或者您可以根据需要进行同步调用。