2010-05-24 99 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) 
相關問題