Здравствуйте, Аноним, Вы писали:
А>Сорри за неопытность -- я недавно в сетях.
А>Проге в командной строке приходит имя компа, с которым надо будет работать. А>Из него надо сделать IP-адрес, чтобы сокет завести. А>Это делает gethostbyname() или getaddrinfo(), но они тормозят в первый раз более 20 с ! А>А потом быстро довольно работают. А>Как это подлечить ? А>ping вон мгновенно резольвится.
По идее так и должно работать. В первый раз адрес нормально резолвится, в этом может принимать участие несколько серверов, это занимает какое-то время. Далее местный сервер кэширует ответ и быстро отдает его.
Однако ping может получить ответ уже из кеша, который получился как результат запроса из вашей программы.
Тормозит gethostbyname() в первый раз
От:
Аноним
Дата:
18.03.13 14:27
Оценка:
Сорри за неопытность -- я недавно в сетях.
Проге в командной строке приходит имя компа, с которым надо будет работать.
Из него надо сделать IP-адрес, чтобы сокет завести.
Это делает gethostbyname() или getaddrinfo(), но они тормозят в первый раз более 20 с !
А потом быстро довольно работают.
Как это подлечить ?
ping вон мгновенно резольвится.
Re: Тормозит gethostbyname() в первый раз
От:
Аноним
Дата:
18.03.13 15:12
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Сорри за неопытность -- я недавно в сетях.
А>Проге в командной строке приходит имя компа, с которым надо будет работать. А>Из него надо сделать IP-адрес, чтобы сокет завести. А>Это делает gethostbyname() или getaddrinfo(), но они тормозят в первый раз более 20 с ! А>А потом быстро довольно работают. А>Как это подлечить ? А>ping вон мгновенно резольвится.
запустите сниффер и посмотрите, что в первый раз происходит с dns запросом:
с первого раза ли он резолвится
в списке dns может быть несколько серверов — смотрите, какой отвечает.
скорее всего, местный dns у вас лажает.
Сравните с ping ом. Только обратит внимание, на разный типа запросов A и PTR
Re[2]: Тормозит gethostbyname() в первый раз
От:
Аноним
Дата:
18.03.13 16:05
Оценка:
А>По идее так и должно работать. В первый раз адрес нормально резолвится, в этом может принимать участие несколько серверов, это занимает какое-то время. Далее местный сервер кэширует ответ и быстро отдает его.
20с — это перебор, надо разбираться в чем дело. Даже при запросе на далекий-далекий dns сервер обычно ответ в пределах 1-2 секунды возвращается.
Здравствуйте, Аноним, Вы писали:
А>Как это подлечить ?
Никак — ибо это нормально. Точнее что бы подлечить придется делать очень много работы — по сути делать в ручную то что делается сейчас через эти функции. Я так понимаю ты спрашиваешь про винды? Если да то ответ выше. Смирись. Или рубись в нейтивный уровень сервиса. Но в принципе сделать можно. Спрашивается а стоит ли оно тебе того? Скажу еще — это глюк виндов, ну так сделано. Увы.
Согласен на любую работу в ядерной физике.
Re[2]: Тормозит gethostbyname() в первый раз
От:
Аноним
Дата:
19.03.13 06:46
Оценка:
Так я же вижу, что кто-то умеет быстро выцыганить ответ из DNS !
Если дадите прямую ссылку на приличный (без инсталляхи, сразу готовый к запуску), но халявный и без троянов сниффер для Винды ХР, буду премного благодарен !
Лет 10 ими не пользовался и не в теме с тех пор, как на NT 4 Server юзал их очень неплохой встроенный.
Вот как работает моя прога: сначала делается "int r = WSAStartup(MAKEWORD(2,2), &wsadata);", потом сразу "inet_addr(hostname)", которое возвращает -1, ибо имя там "NOTEBOOK-D" не только из цифр и точек состоит, а потом и "struct hostent *hp = gethostbyname(hostname);", которая работает ну очень долго.
Через depends.exe глянул, какие функции импортирует ping.exe из WS2_32.DLL -- это WSAIoctl(), freeaddrinfo(), getaddrinfo(), getnameinfo(), и ещё 7 безымянных с номерами 3, 12, 23, 51, 111, 115, 116 -- типа секретные для служебного пользования, с которыми всё работает гораздо быстрей ?
Ещё WS2_32.DLL импортирует функцию RtlIpv4StringToAddressA() из NTDLL.DLL, но та вроде резольвингом не занимается.
Попробовал вызвать первым делом "struct hostent *hp = gethostbyname("localhost");" -- 30 секунд те же, и потом мой "NOTEBOOK-D" резольвится уже мгновенно следующим вызовом, как будто ответы на все вопросы уже закэшировал. Самое интересное, что в "C:\WINDOWS\system32\drivers\etc\hosts" у меня явно написано "127.0.0.1 localhost" ! Почему в него лазит так долго Винда, очень неясно.
И опять же, "ping localhost" находит адрес 127.0.0.1 и начинает выполняться мгновенно.
Ну или, действительно, первичный DNS-сервер не фурычит, повтор на резервный пробуется довольно поздно, а следующие запросы идут уже по более правильному пути. Повторяю, что проблема при каждом запуске проги, и только первый резольвиинг глючит по времени больше разумного.
Может где в реестре можно таймаут в 1 с задать для DNS ? У него ж в памяти все таблицы должны лежать для локалки.
...Конечно, можно завести ini-файл, где сохранять все бывалые имена хостов с их найденными адресами, лазить сначала туда, но вдруг поедет что-то на сервере DNS, будет ещё кривей разбираться.
Умеют же некие "фирменные" люди, и другим охота !
Или к MS надо куда-то ходить за разъяснениями ? Что у них спросить на их языке и/или в Гугле ?
Здравствуйте, Аноним, Вы писали:
А>Ну или, действительно, [помогите люди добрые].
Ничем конкретным не помогу, могу только сказать 1) Кеширование тут не причем. 2) Найдите исходники ping и смотрите сами. 3) Ответ насколько я помню ( а довно это было ) не прост, и скорее всего вы откажетесь от его реализации. Так что ищите другой выход, или вам придется рубиться в сервисы которые насамом деле в виндах занимаются этм и к которым ходит ваша сокетная функция.
Все тчк. Вообще не понял зачем сюда влез. Спасбо за внимание. Пока! ... Всех благ, ... ну вообщем увидимся.
ну чтож вы как дети, заатачьтесь windbg к процессу, нажмите ctrl+break посередине зависона и гляньте что там на стеках..
Как много веселых ребят, и все делают велосипед...
Re[4]: Тормозит gethostbyname() в первый раз
От:
Аноним
Дата:
19.03.13 14:05
Оценка:
O>ну чтож вы как дети, заатачьтесь windbg к процессу, нажмите ctrl+break посередине зависона и гляньте что там на стеках..
Нет, всё как-то трагичнее -- поставили Wireshark-win32-1.8.4, по пакетам оказалось, что перед резольвингом имени моего оппозиционного компа Винда пытается достучаться до шары выключенного компа и поиметь оттуда несколько файлов. И так снова и снова. Комп включили -- всё стало летать. Запросы в шару продолжаются несмотря на возврат "левым" компом ошибок каждый раз.
Что там за параллельные задачи решает gethostbyname() при вызове мною, пусть останется на совести Б.Г.
Всем спасибо ! Хотя вдруг подскажете, как отрубить "вечное домашнее задание" для моего резольвинга, буду очень признателен.
Здравствуйте, Аноним, Вы писали:
А>Что там за параллельные задачи решает gethostbyname() при вызове мною, пусть останется на совести Б.Г. А>Всем спасибо ! Хотя вдруг подскажете, как отрубить "вечное домашнее задание" для моего резольвинга, буду очень признателен.
Я же тебе намекнул таинственно — ищи исходники пинга виндового. Там все делается не так как ты думаешь.
А>>Что там за параллельные задачи решает gethostbyname() при вызове мною, пусть останется на совести Б.Г. А>>Всем спасибо ! Хотя вдруг подскажете, как отрубить "вечное домашнее задание" для моего резольвинга, буду очень признателен. N>Я же тебе намекнул таинственно — ищи исходники пинга виндового. Там все делается не так как ты думаешь.
там делается getaddrinfo
Как много веселых ребят, и все делают велосипед...
А>Нет, всё как-то трагичнее -- поставили Wireshark-win32-1.8.4, по пакетам оказалось, что перед резольвингом имени моего оппозиционного компа Винда пытается достучаться до шары выключенного компа и поиметь оттуда несколько файлов. И так снова и снова. Комп включили -- всё стало летать. Запросы в шару продолжаются несмотря на возврат "левым" компом ошибок каждый раз.
Повторяю — берете дебагер в руки и смотрите кто чего в процессе творит. Может у вас хитронастроенный файрволл или троян какой на системе.
Как много веселых ребят, и все делают велосипед...
O>Повторяю — берете дебагер в руки и смотрите кто чего в процессе творит. Может у вас хитронастроенный файрволл или троян какой на системе.
Да, тут трагикомедия оказалась именно из-за троянца-дебагера в самой Студии в сговоре с AVP !
При моём обращении в резольвинг Каспер 6.0 решил подгрузить пару своих DLL "на всякий случай", дебагер ищет их отладочную информацию, прописанную внутри этих файлов, она на букве P: с каким-то путём .pdb, у меня такая буква есть, но комп тот выключен, начинается ретро-пляска...
Короче, есть предложение к Касперам отладочную инфу совсем не публиковать в своих релизных сборках
И исходники ping-а не помогли б совсем -- там было б то же самое. И дебагеры аналогично, саму себя Студия фиг отладит за волосы
Вот сниффер с показом имени открываемого файла в шаре -- это вещь ! Так и хочется авторам денег кинуть, только не знаю, как в GPL v2
Здравствуйте, witfed, Вы писали:
W>Да, тут трагикомедия оказалась именно из-за троянца-дебагера в самой Студии в сговоре с AVP ! W>При моём обращении в резольвинг Каспер 6.0 решил подгрузить пару своих DLL "на всякий случай", дебагер ищет их отладочную информацию, прописанную внутри этих файлов, она на букве P: с каким-то путём .pdb, у меня такая буква есть, но комп тот выключен, начинается ретро-пляска... W>Короче, есть предложение к Касперам отладочную инфу совсем не публиковать в своих релизных сборках
В меню студии Tools->Options->Debugging->Symbols можно сделать "Specify excluded modules" модулям, для которых студия не нашла pdb-файлы.
Для каких модулей не найдены pdb-файлы можно посмотреть в Output->Debug.