Re: Тормозит gethostbyname() в первый раз
От: Аноним  
Дата: 18.03.13 15:41
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Сорри за неопытность -- я недавно в сетях.


А>Проге в командной строке приходит имя компа, с которым надо будет работать.

А>Из него надо сделать 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: Тормозит gethostbyname() в первый раз
От: nonyme  
Дата: 18.03.13 16:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как это подлечить ?


Никак — ибо это нормально. Точнее что бы подлечить придется делать очень много работы — по сути делать в ручную то что делается сейчас через эти функции. Я так понимаю ты спрашиваешь про винды? Если да то ответ выше. Смирись. Или рубись в нейтивный уровень сервиса. Но в принципе сделать можно. Спрашивается а стоит ли оно тебе того? Скажу еще — это глюк виндов, ну так сделано. Увы.
Согласен на любую работу в ядерной физике.
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 надо куда-то ходить за разъяснениями ? Что у них спросить на их языке и/или в Гугле ?
Re[3]: Тормозит gethostbyname() в первый раз
От: nonyme  
Дата: 19.03.13 06:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну или, действительно, [помогите люди добрые].


Ничем конкретным не помогу, могу только сказать 1) Кеширование тут не причем. 2) Найдите исходники ping и смотрите сами. 3) Ответ насколько я помню ( а довно это было ) не прост, и скорее всего вы откажетесь от его реализации. Так что ищите другой выход, или вам придется рубиться в сервисы которые насамом деле в виндах занимаются этм и к которым ходит ваша сокетная функция.

Все тчк. Вообще не понял зачем сюда влез. Спасбо за внимание. Пока! ... Всех благ, ... ну вообщем увидимся.
Согласен на любую работу в ядерной физике.
Re[3]: Тормозит gethostbyname() в первый раз
От: ononim  
Дата: 19.03.13 10:46
Оценка:
ну чтож вы как дети, заатачьтесь windbg к процессу, нажмите ctrl+break посередине зависона и гляньте что там на стеках..
Как много веселых ребят, и все делают велосипед...
Re[4]: Тормозит gethostbyname() в первый раз
От: Аноним  
Дата: 19.03.13 14:05
Оценка:
O>ну чтож вы как дети, заатачьтесь windbg к процессу, нажмите ctrl+break посередине зависона и гляньте что там на стеках..

Нет, всё как-то трагичнее -- поставили Wireshark-win32-1.8.4, по пакетам оказалось, что перед резольвингом имени моего оппозиционного компа Винда пытается достучаться до шары выключенного компа и поиметь оттуда несколько файлов. И так снова и снова. Комп включили -- всё стало летать. Запросы в шару продолжаются несмотря на возврат "левым" компом ошибок каждый раз.
Что там за параллельные задачи решает gethostbyname() при вызове мною, пусть останется на совести Б.Г.
Всем спасибо ! Хотя вдруг подскажете, как отрубить "вечное домашнее задание" для моего резольвинга, буду очень признателен.
Re[5]: Тормозит gethostbyname() в первый раз
От: nonyme  
Дата: 19.03.13 14:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что там за параллельные задачи решает gethostbyname() при вызове мною, пусть останется на совести Б.Г.

А>Всем спасибо ! Хотя вдруг подскажете, как отрубить "вечное домашнее задание" для моего резольвинга, буду очень признателен.

Я же тебе намекнул таинственно — ищи исходники пинга виндового. Там все делается не так как ты думаешь.
Согласен на любую работу в ядерной физике.
Re[6]: Тормозит gethostbyname() в первый раз
От: ononim  
Дата: 19.03.13 14:17
Оценка:
А>>Что там за параллельные задачи решает gethostbyname() при вызове мною, пусть останется на совести Б.Г.
А>>Всем спасибо ! Хотя вдруг подскажете, как отрубить "вечное домашнее задание" для моего резольвинга, буду очень признателен.
N>Я же тебе намекнул таинственно — ищи исходники пинга виндового. Там все делается не так как ты думаешь.
там делается getaddrinfo
Как много веселых ребят, и все делают велосипед...
Re[5]: Тормозит gethostbyname() в первый раз
От: ononim  
Дата: 19.03.13 14:18
Оценка:
А>Нет, всё как-то трагичнее -- поставили Wireshark-win32-1.8.4, по пакетам оказалось, что перед резольвингом имени моего оппозиционного компа Винда пытается достучаться до шары выключенного компа и поиметь оттуда несколько файлов. И так снова и снова. Комп включили -- всё стало летать. Запросы в шару продолжаются несмотря на возврат "левым" компом ошибок каждый раз.
Повторяю — берете дебагер в руки и смотрите кто чего в процессе творит. Может у вас хитронастроенный файрволл или троян какой на системе.
Как много веселых ребят, и все делают велосипед...
Re[6]: Тормозит gethostbyname() в первый раз
От: witfed  
Дата: 20.03.13 07:11
Оценка:
O>Повторяю — берете дебагер в руки и смотрите кто чего в процессе творит. Может у вас хитронастроенный файрволл или троян какой на системе.

Да, тут трагикомедия оказалась именно из-за троянца-дебагера в самой Студии в сговоре с AVP !
При моём обращении в резольвинг Каспер 6.0 решил подгрузить пару своих DLL "на всякий случай", дебагер ищет их отладочную информацию, прописанную внутри этих файлов, она на букве P: с каким-то путём .pdb, у меня такая буква есть, но комп тот выключен, начинается ретро-пляска...
Короче, есть предложение к Касперам отладочную инфу совсем не публиковать в своих релизных сборках
И исходники ping-а не помогли б совсем -- там было б то же самое. И дебагеры аналогично, саму себя Студия фиг отладит за волосы
Вот сниффер с показом имени открываемого файла в шаре -- это вещь ! Так и хочется авторам денег кинуть, только не знаю, как в GPL v2
Re[7]: Тормозит gethostbyname() в первый раз
От: DM.PROFF Россия  
Дата: 20.03.13 09:11
Оценка:
Здравствуйте, witfed, Вы писали:

W>Да, тут трагикомедия оказалась именно из-за троянца-дебагера в самой Студии в сговоре с AVP !

W>При моём обращении в резольвинг Каспер 6.0 решил подгрузить пару своих DLL "на всякий случай", дебагер ищет их отладочную информацию, прописанную внутри этих файлов, она на букве P: с каким-то путём .pdb, у меня такая буква есть, но комп тот выключен, начинается ретро-пляска...
W>Короче, есть предложение к Касперам отладочную инфу совсем не публиковать в своих релизных сборках

В меню студии Tools->Options->Debugging->Symbols можно сделать "Specify excluded modules" модулям, для которых студия не нашла pdb-файлы.
Для каких модулей не найдены pdb-файлы можно посмотреть в Output->Debug.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.