iPhone中的getaddrinfo
Posted
技术标签:
【中文标题】iPhone中的getaddrinfo【英文标题】:getaddrinfo in iPhone 【发布时间】:2009-08-06 13:35:34 【问题描述】:我准备了一个小应用程序。当我重新启动我的 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 Socket 的应用程序可以通过使用 CFSocketStream API 与 TCP 服务器(包括 HTTP Web 服务器)建立连接来建立 WWAN 连接。一旦连接处于活动状态,程序就可以像过去一样运行。这是访问网络服务的 Safari、Mail 和其他 Apple 应用程序用来建立连接的方法。出于这个原因,当你启动 Safari,然后启动你的应用程序网络访问工作。使用 Safari 会导致 iPhone 建立 WWAN 连接。当您退出 Safari 时,WWAN 不会自动关闭 - 它会在短时间内保持活动状态。如果您启动应用程序,WWAN 服务将处于活动状态,并且只要存在网络活动,您的应用程序就会使 WWAN 保持活动状态。
如果您的应用程序使用 TCP 进行联网,那么您可以修改代码以使用 CFSocketStream 或相关 API 进行联网。当然,如果您有一个完整的 BSD 套接字功能库,那么对于希望尽快将他们的应用程序放到 App Store 上的人来说,这可能不是一个合理的解决方案。
....
【问题讨论】:
您可能还没有网络,尤其是在您刚刚重启手机的情况下。使用系统配置框架来确保您确实有一个网络堆栈,如果没有,则请求一个。 【参考方案1】:这里可能发生的情况是getaddrinfo()
没有阻止等待 DNS 查找,这可能是一件好事,因为 iPhone 上的 DNS 查找可能需要很长时间。一旦您在其他地方完成了查找,它就会为您提供缓存的答案。
查看CFHost,这是在 iPhone 上获取此类信息的首选方式。它支持异步回调,让您知道信息何时可用,或者您可以根据需要进行同步调用。
【讨论】:
以上是关于iPhone中的getaddrinfo的主要内容,如果未能解决你的问题,请参考以下文章
从 iphone 相机拍照时收到 iphone 中的内存警告问题
iPhone 4S 与 iPhone 3GS 中的 UILabel