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