![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с потоками сканирования [WinXP]
bvv © (2009-09-17 14:57:00)Знатоки!
Написал программу сканирования сети.
Для сокращения времени сканирования разбил проверку адресов IP на потоки, если результаты поиска по каждому потоку выводить в свой файл проблем никаких. Если результаты поиска записывать во временный массив простая синхронизации потоков работает только при небольшом количестве потоков. Критические секции немного улучшают ситуацию, но поиск в 256 потоков находит число IP-адресов гораздо больше чем с 1792 потока, переход на Mutex проблемы не решает и оптимальным числом потоков остаётся ~512. Mutex используется только при завершении работы потока для записи результатов поиска в общий массив, да и то, для каждого потока организован свой раздел в массиве, в который нет доступа другим потокам. Процессор двух ядерный.
Всё процессорное время, во время сканирования, съедают Svchost и Acs.
Почему происходят такое различие результатов поиска, если число потоков отличается в три раза, если верить теории этого быть не должно.
С благодарностью Вл.
Anatoly Podgoretsky (2009-09-21 12:04:00) [1]Если не брать во внимание некоторые особенности и считать что бардака нет, что для каждой записи обратной зоные есть хоть одна прямая, то я не вижу разницы.
Сергей М. (2009-09-18 17:13:00) [2]
> Anatoly Podgoretsky © (18.09.09 16:53) [44]
Ты что-то не понял)
Автор обращается не к прямой, а к обратной зоне.
Anatoly Podgoretsky (2009-09-18 16:53:00) [3]> Сергей М. (18.09.2009 15:48:42) [42]
Насколько я понял ваш разговор, речь идет о получение информации из ДНС адрес за адресом.
У ДНС можно получить всю информацию о домене за раз, как это сделано в NSLOOKUP
bvv (2009-09-18 16:25:00) [4]Спасибо Анатолий, я обязательно посмотрю литературу.
С благодарностью, В
Удачи Вам.
Сергей М. (2009-09-18 15:48:00) [5]
> Anatoly Podgoretsky © (18.09.09 15:37) [41]
??
Anatoly Podgoretsky (2009-09-18 15:37:00) [6]
> Точнее, сканирование-то есть, но сканируешь ты вовсе не
> то, что заявил в топикстарте: ты просто тупо шаришь по записям
> доступных тебе DNS-рерурсов.
Кстати ДНС в состояние выдать все записи зараз, и даже определенного типа, нет никакой нужды сканировать ДНС запись за записью.
Anatoly Podgoretsky (2009-09-18 15:25:00) [7]> bvv (17.09.2009 17:12:08) [8]
Поэтому и неверно вешать блок на один поток, пока он ждет ответа от несуществуеющего ИП, то остальные тоже ждут, а могли бы работать, если бы поток занимался только одним ИП. Результат может быть очень существенным, по сути равным обработке одного потока, даже если все ИП не существуют. Ну а класс С взят просто как удобная величина, поскольку обычно пингуют не больше одного класса за раз, на самом деле никакой связи с классами нет, это может произвольный список и количество потоков не обязательно 256, может эффективнее будет 512. Все будет зависить от количества адресов. Но и в этом случае один поток может обслужить 100 адресов, пока другой поток ждет ответа. И не надо потоки постоянно создавать разрушать, достаточно пула потоков.
bvv (2009-09-18 14:11:00) [8]Понял.
До свидания.
Разберусь с сетями вернусь.
Конец связи.
В
Сергей М. (2009-09-18 14:01:00) [9]
> потоки всё-таки, можно рассматривать и без глубокого понимания
> работы сети, мне почему-то так кажется
Правильно кажется.
Более того, на этом этапе их следовало бы рассматривать в полном отрыве от сетевой логики.
Т.е. мухи отдельно (потоки, синхронизация и т.д. и т.п.), а котлеты отдельно (сети, протоколы и т.д. и т.п).
И уж только тогда следует сажать мух на котлеты, когда мухи станут большими-злыми-зелеными-осенними, а котлеты будут хорошо прожарены)
О чем я тебе и сказал в [32] (про эмулятор)
bvv (2009-09-18 13:31:00) [10]Да, я читал об UDP и других протоколах, назначение их тоже для меня более или менее ясно, Олифера прочитал и общая картина сети понятна, но теория без практики пустое место, пока своими руками что-то не сделаешь, нечего и говорить о том, что знаешь. Телефонный справочник может быть и интересное чтиво, особенно на ночь, но если нет телефона или некуда звонить...
То же и с сетями, надо пробовать и порверять.
Но потоки всё-таки, можно рассматривать и без глубокого понимания работы сети, мне почему-то так кажется...
Но может быть я не прав.
Сергей М. (2009-09-18 13:15:00) [11]Ключевой момент, могущий пролить свет на тайну: сетевые DNS-сервисы работают под управлением транспортного протокола UDP, который не гарантирует доставку инф.сообщений от источника к приемнику.
И чем "дальше" от твоего хоста находится хост, предоставляющий DNS-сервис, тем меньше вероятность достоверности получаемых при DNS-запросах данных.
Сергей М. (2009-09-18 13:09:00) [12]Точнее, сканирование-то есть, но сканируешь ты вовсе не то, что заявил в топикстарте: ты просто тупо шаришь по записям доступных тебе DNS-рерурсов.
bvv (2009-09-18 13:07:00) [13]
>
> Придется в той или иной минимум необходимой мере им стать,
> если ты действительно желаешь осознать происходящее.
> И это, скажем, не самое худшее лекарство от отупения)
> <Цитата>
Соглосен на все сто.
Удачи Вам!
В
Сергей М. (2009-09-18 13:01:00) [14]
> не специалист по сетям
Придется в той или иной минимум необходимой мере им стать, если ты действительно желаешь осознать происходящее.
И это, скажем, не самое худшее лекарство от отупения)
Сергей М. (2009-09-18 12:57:00) [15]
> Почему при сканировании
Да нет у тебя никакого сканирования, что ты заладил про сканирование ?)
> локалки, в которой я живу, она точно называет имена и адреса
> рабочих станций и серверов
Потому что эта инф-ция имеется и доступна в тех DNS-базах, к которым ты осуществляешь обращение при своем т.н. "сканировании".
А рассуждать о какой-то синхронизации сейчас попросту бессмысленно - нет достоверной инф-ции, которую требуется синхронно заносить в аккумулирующий ресурс.
Рекомендую в целях отладки мультипоточного синхронного взаимодействия реализовать эмулятор, который бы не лез в сеть, а возвращал бы данные о хостах из заранее подготовленной локальной таблицы.
bvv (2009-09-18 12:37:00) [16]Хорошо, я понял что запрос идёт на DNS.
Пусть в этом вотросе я полный ноль.
Согласен, это действительно не далеко от истины.
Но, почему при разном сисле потоков получаю разное число хостов, хотя запускаются одновременнодве программы, и таблица хостов на DNS не должна так быстро меняться?
Кроме того, повторное сканирование с малым числом потоков 512 точно повторяет предыдущий результат?
Я понимаю если бы результат сканирования 512 и 1792 потока отличался на единицы, но речь идёт о разах. 3-4 раза
Даже если опрос по этой функции даёт полный бред, то почему в одном случае этот бред повторяется с точностью до хоста, а во втором случае нет.
Почему при сканировании локалки, в которой я живу, она точно называет имена и адреса рабочих станций и серверов?
Я не специалист по сетям, и занимаюсь этим, чтобы не отупеть полностью, и не потерять навыки, поскольку решение систем трансцедентных и дифуравнений, при проектировании физических установок в нашей стране уже давно никого не интересут.
Сергей М. (2009-09-18 12:30:00) [17]И еще: за массированное сканирование хостов и сервисов можно и по шее получить от провайдера)
Сергей М. (2009-09-18 12:18:00) [18]Простая ассоциация для наведения порядка в голове:
Наличие у тебя или кого-либо в адресной книге (читай - база данных DNS) в мобильном телефоне записи
"Имя: Вася Пупкин (читай - HostName), Телефон: 123456789 (читай - HostAddress)"
неозначает:
- что Вася Пупкин жив;
- что у него есть телефон;
- что в телефоне установлена симка именно на номер 123456789;
- что владелец телефона и симки в дан.момент именно Вася Пупкин;
- что телефон этот включен;
- что на этот телефон можно позвонить и дозвониться;
- что ответит именно Вася Пупкин и никто иной.
bvv (2009-09-18 12:04:00) [19]Спасибо, буду разбираться.
С уважением, В
Сергей М. (2009-09-18 11:59:00) [20]
> Мне нужно имя хоста
У хоста может не быть имени, от этого он хостом быть не перестанет.
> если есть имя, значит есть и хост
Нет.
Если есть имя, значит есть адрес хоста, а не хост.
Во-первых, ф-ции gethostbyaddr() нет никакого дела до того, присутствует ли хост в сети в момент ее вызова. Она к интересующему хосту не обращается вообще.
Во-вторых, ф-ция gethostbyaddr() позиционируется в Майкрософт как устаревшая, вместо нее настоятельно рекомендуется использовать протоколонезависимую ф-цию getnameinfo(), хотя суть использования новой или старой функции неизменна.
Так что до синхронизации тебе еще как до Китая - ты в принципене понимаешь что творишь и как это в действительности работает.