我正在尝试同步阅读由CFReadStream
创建的CFStreamCreatePairWithSocketToHost
反对意见。流打开很好,但是当我尝试在循环中调用CFReadStreamRead
时,CFReadStreamRead()返回-1,结果错误是:
Error Domain=kCFErrorDomainCFNetwork Code=2 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)" UserInfo=0x14a920 {kCFGetAddrInfoFailureKey=8}
在异步使用此ReadStream时,我也收到同样的错误 - 我收到的第一个回调就是这个错误。
答案 0 :(得分:8)
短篇小说:可能是DNS解析失败。
文档说“在打开其中一个流之前,流不会打开与指定主机的连接”,对于kCFGetAddrInfoFailureKey,
查询此键将返回getaddrinfo(3)返回的最后一个错误代码,以响应DNS查找。要解释结果,请在/usr/include/netdb.h中查找错误代码。
netdb.h说
#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
答案 1 :(得分:2)
我可以通过在“设置”应用中的wifi连接中输入Google的DNS服务器(8.8.8.8,8.8.4.4)来解决此问题。问题是我们的设备在网络上首先要求您同意代理登录网页上的某些服务条款,就像酒店和咖啡店一样。 Safari在同意之后工作得很好,但即使在Safari中达成一致之后,应用程序也没有。切换到备用DNS工作(输入IP地址而不是我们服务器的DNS条目,但我不想硬编码IP地址)。
答案 2 :(得分:2)
我可以通过从主机字符串中删除https://
来消除此错误。
NSStream.getStreamsToHostWithName(“ https:// example.com”......
您可能需要设置适当的安全级别:
inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)