Медленный поиск DNS на симуляторе iOS - PullRequest
4 голосов
/ 08 ноября 2011

Я использую NSURLConnection для доступа к веб-службе (на хосте .local).Когда я получаю доступ к хосту по имени хоста, я вижу задержку более 5 секунд, но когда я получаю доступ к нему по IP, соединение завершается почти мгновенно.Запуск приложения на реальном iPhone вместо симулятора вообще не показывает никаких задержек (тестирование проводилось на том же сетевом соединении).Так что, похоже, это проблема, характерная для iOS Simulator или OS X.

Я могу смоделировать проблему, используя следующие команды терминала:

nslookup webservice.myhost.local (что быстро)

dscacheutil -q host -a name webservice.myhost.local ( показывает задержку )

При анализе сетевого трафика с помощью Wireshark команды dscacheutil я вижу несколько запросов Standard query AAAA, которыепомечены красным и получают пустой ответ.После этого я вижу запрос Standard query A, в котором есть ответ, содержащий правильный IP-адрес.Запросы AAAA занимают около 5 секунд, что объясняет задержку.

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Возможно, в веб-сервисе включен IPv6, и вы не можете использовать его с симулятора?

Я вижу это на OSX, например, при запуске локальной службы DNS только для IPv4 - если я запускаю dig @localhostis зависает на несколько секунд до истечения времени ожидания первоначального соединения IPv6, а затем пытается IPv4.

2 голосов
/ 02 мая 2012

Этот ответ решил проблему для меня.(Создайте запись обратной петли IPv6 :: 1 для каждого 127.0.0.1.)

1 голос
/ 17 августа 2012

Для всех, кто сталкивается с этой проблемой ... Я сам должен был отключить IPv6 на своей машине, чтобы избежать зависания в симуляторе во время сбоя IPv6.Я сделал это, следуя этим инструкциям: https://discussions.apple.com/message/18097613#18097613

Которые должны были:

"Чтобы отключить IPv6 в OS X Lion, вам нужно будет использовать Терминал.

Приложения> Утилиты> Терминал

Чтобы определить все сетевые интерфейсы вашего Mac, введите следующую команду: networksetup -listallnetworkservices

Чтобы отключить IPv6 для беспроводной сети, введите следующую команду: networksetup -setv6offWi-Fi;

Чтобы отключить IPv6 для Ethernet, введите следующую команду: networksetup -setv6off Ethernet

Чтобы повторно включить IPv6, используйте вместо него -setv6automatic "

...