Получение домена ошибки=Kcferrordomaincfnetwork Code=2 при попытке чтения из ReadStream

Я пытаюсь синхронно читать из CFReadStream возражал, созданные CFStreamCreatePairWithSocketToHost. Поток открылся нормально, но когда я пытаюсь вызвать CFReadStreamRead на нем в цикле CFReadStreamRead () возвращает -1 и результирующая ошибка:

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

Я также получаю эту же точную ошибку при использовании этого ReadStream асинхронно - первый обратный вызов, который я получаю, это ошибка.

3 ответов


короткая история: вероятно, сбой разрешения DNS.

в документах говорится: "потоки не открывают соединение с указанным хостом, пока не будет открыт один из потоков", а для kCFGetAddrInfoFailureKey,

запрос этого ключа возвращает последний код ошибки, возвращенный getaddrinfo (3) в ответ на поиск DNS. Чтобы интерпретировать результаты, найдите код ошибки в /usr/include / netdb.h.

netdb.ч говорит

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

Я смог исправить это, поместив DNS-серверы Google (8.8.8.8,8.8.4.4) в wifi-соединение в приложении "Настройки". Проблема заключалась в том, что наши устройства были в сети, которая сначала требовала, чтобы вы согласились с некоторыми условиями обслуживания на веб-странице входа прокси, так же, как отели и кафе. Safari отлично работал после согласования, но приложение не работало, даже после согласования в Safari. Переключение на альтернативный DNS работало (так же как и ввод IP-адреса вместо записи DNS нашего сервера, но я не хотел жестко кодировать IP-адрес).


я смог устранить эту ошибку путем удаления https:// из строки хоста.

NSStream.getStreamsToHostWithName (" https://example.com"...

возможно, Вам потребуется установить соответствующий уровень безопасности:

 inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)