2010-05-24 98 views
9

我试图从CFReadStream同步读取CFStreamCreatePairWithSocketToHost创建的对象。流打开正常,但当我尝试调用它CFReadStreamRead在一个循环,CFReadStreamRead()返回-1,所产生的误差是:尝试从ReadStream读取时接收错误域= kCFErrorDomainCFNetwork代码= 2

Error Domain=kCFErrorDomainCFNetwork Code=2 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)" UserInfo=0x14a920 {kCFGetAddrInfoFailureKey=8}

使用这个时,我也收到此相同的确切的错误ReadStream异步 - 我收到的第一个回调是这个错误。

回答

8

小故事:可能是DNS解析失败。

文档说“该流不开,直到流之一被打开到指定主机的连接”,并为kCFGetAddrInfoFailureKey,

查询通过的getaddrinfo返回的最后一个错误代码此键返回( 3)响应DNS查找。要解释结果,请在/usr/include/netdb.h中查找错误代码。

netdb.h中说

#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ 
+0

确定究竟什么是修复呢? !我有一个RESTful服务调用,在我的浏览器中工作正常,但是通过ASIHTTPRequest获取相同的请求会从这个帖子中得到错误信息。有没有人知道该从哪里下载? – Mark 2011-03-15 14:38:39

+2

-1这个答案,不提及如何避开错误和只解释什么错误的意思。 – Shailesh 2013-02-06 07:34:09

+9

@Shailesh:你怎么样,确切地说,你期望绕过DNS失败? – 2013-02-18 16:51:48

2

我能够通过在设置应用程序的wifi连接投入谷歌的DNS服务器(8.8.8.8,8.8.4.4)来解决这个问题。问题在于我们的设备位于首先要求您同意代理登录网页上的某些服务条款的网络上,非常类似于酒店和咖啡店。 Safari同意后正常工作,但该应用程序没有,即使在Safari中达成一致。切换到备用DNS工作(所以没有放入IP地址而是我们的服务器的DNS条目,但我不想硬编码IP地址)。

1

我能够通过从主机字符串中删除https://来消除此错误。

NSStream.getStreamsToHostWithName( “ https://开头 example.com” ......

您可能需要设置相应的安全级别:

inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
相关问题