Ошибка получения Domain=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.h говорит

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

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

Мне удалось устранить эту ошибку, удалив https:// от хозяина String.

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

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

 inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
Другие вопросы по тегам