Ошибка получения 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)