-
Знатоки! Написал программу сканирования сети. Для сокращения времени сканирования разбил проверку адресов IP на потоки, если результаты поиска по каждому потоку выводить в свой файл проблем никаких. Если результаты поиска записывать во временный массив простая синхронизации потоков работает только при небольшом количестве потоков. Критические секции немного улучшают ситуацию, но поиск в 256 потоков находит число IP-адресов гораздо больше чем с 1792 потока, переход на Mutex проблемы не решает и оптимальным числом потоков остаётся ~512. Mutex используется только при завершении работы потока для записи результатов поиска в общий массив, да и то, для каждого потока организован свой раздел в массиве, в который нет доступа другим потокам. Процессор двух ядерный. Всё процессорное время, во время сканирования, съедают Svchost и Acs. Почему происходят такое различие результатов поиска, если число потоков отличается в три раза, если верить теории этого быть не должно.
С благодарностью Вл.
-
И куда столько потоков ? Очуметь же можно - аж под две тысячи) Хотя для решения задачи с неменьшей эффективностью вполне хватит и дюжины)
-
Основное время тратится на ожидание ответа, если сеть класса В и занято много адресов, время сканирования десятки минут, если свободных адресов большая часть это Часы, даде при 512 потоках.
-
> время тратится на ожидание ответа
Ну так ведь поток, получивший ответ, можно тут же напрячь пинговать следующий адрес..
А пинг-то какими средствами ? raw sockets или wininet-интерфейс ?
-
Так ведь я так и делаю, каждый поток пингует свой диапазон адресов.
-
> bvv (17.09.2009 16:44:04) [4]
Не очень верно, пусть поток сканирует только один адрес, тогда быстрее будет. 256 потоков достаточно, для блока С, а к нему можно привести и В и С. По сути получается почти равное время, что для одного потока.
-
Для С сети проблем вообще никаких нет, если В сетку сканировать как последовательный ряд С сетей, судя по всему Вы правы, но тогда каждый раз нужно создавать и гасить новые потоки, а это время. Гораздо проще, весь диапазон разбить на равные отрезки, и на каждый отрезок создать свай поток, это ничему не противоречит, поскольку в каждом потоке не проверяется больше одной станции, и мы не выходим за предельное число потеков в одном процессе, кроме того, если каждый поток записывает результаты поиска в свой файл, тогда здесь даже синхронизация потоков не нужна, всё на Ура проходит.
-
> каждый поток пингует свой диапазон адресов
А пинговать он должен один адрес, который ему выдаст диспетчер. Т.е. поток получил адрес, выполнил пинг, отчитался диспетчеру о результатах пинга и ждет получения след.адреса.
-
Естественно один, цикл выбирает по одному адресу, и пока не получен ответ на адрес, следующий пинг не начнётся, тоже и с Файлами, но там я для записи результата открывал файл, записывал и закрывал. с массивом этого делать не нужно а это выигрыш по времени.
-
На вопрос в [3] ответишь ?
-
Сергей, я не не знаю что значит [3] т.к. на форум пришёл впервые, да если честно то и потоками занимаюсь недавно, прочитал и решил модернизировать свою программу, и тут же фэйсом об тэйбол.
-
При чем здесь потоки ? Я о пинге, а не о потоках ..
-
Сергей, извините, вчере пришлось срочно убегать. Поиск станци в сети выполняется функцией IPAddrToName В старой программе для поиска невидимых станций исполь зовался ещё и сокет, но это к делу не относится.
-
-
Сдул конечно, любая вещь гдде нибудь сдувается дорабатывается и снова сдувается. Перебирая в цикле адреса определяю наличие станций если есть имя значит есть станция. Любая проверка наличия станции в сети, так или иначе связана с установкой связи с ней, (если конечно не берётся готовая таблица станций) связь осуществляется соединением по порту, на некоторых станциях может быть запрещён отклик на запрос IPAddrToName, но если станция в сети, значит у неё должен быть открыт как минимум один порт. С помощью сокета можно это зделать, и делалось, но сейчас главной задачей было разобраться с работой потоков, и поиск другиз станций меня пока не интересует. Но в принципе я могу решить задачу сканирования станции обойдясь без всякой синхронизации потоков, просто записывая результаты проверки во временные файлы а после тойже программой считывать сних информацию и обрабатывать её. Это даже решит другую проблему передачи информации из одного процесса в другой без всяких симафоров и Мьютексов, но хотелось разобраться с синхронизацией. Вопрос чисто теоретический, греть процессор никому ненужными синусами для рассмотрения этой проблемы - себя не уважать, вот и занимаюсь извращенияви в сети, а заодно и частично восполню пробел в знаниях.
-
> если есть имя значит есть станция
Вот уж глупости. Наличие зарегистрированного в обратной зоне DNS имени хоста ниак не связано с активностью и/или доступностью этого хоста.
> связь осуществляется соединением по порту
Хост не обязан отвечать на запросы на соединение по интересующему тебя порту, равно как и на ping-пакеты, и это ничуть не мешает ему присутствовать в сети.
> на некоторых станциях может быть запрещён отклик на запрос > IPAddrToName
Эта ф-ция не обращается к "станциям", у нее иное назначение, см.выше (DNS)
> если станция в сети, значит у неё должен быть открыт как > минимум один порт
С какого это перепугу "должен быть" ? Это зависит от того как станция сконфигурирована, так что она вовсе не обязана быть чем-то должна твоему сканеру.
Ты пойми главное - не существует и не может существовать ни одного алгоритма, позволяющего со 100%-ной достоверностью определить факт присутствия узла в сети.
-
Обнаружить в сети хост можно только если этого захочет администратор хоста. Ну или по недосмотру или раздолбайству этого администратора)
-
> Сдул конечно
Ну так надо было вникнуть в то что сдул, а не слепо верить в волшебные возможности сдутого)
-
> Ты пойми главное - не существует и не может существовать > ни одного алгоритма, позволяющего со 100%-ной достоверностью > определить факт присутствия узла в сети.
Так я с этим и не спорю, 100% гарантия может быть только по свершившемуся факту, (Машина врералась в дерево) это может не говорить о причинах свершившегося факта, но он либо есть либо нет. Я не ставлю перед собой задачу 100% поиска станций, и не собираюсь заниматься их взломом, (Дорожу своим рабочим местом). Я говорю, это чисто теоретический вопрос с синхронизацией большого числа потоков, поэтому данная функция IPAddrToName меня вполне устраивает, пусть прячутся и правильно делают, а то иногда встречаются станции с расшаренным С диском и даже Program Files нараспашку... Иногда ставлю их в известность об этом, но чаще просто оставляю как есть, пусть сами разбираются, причём не только у нас но и за бугром такое бывает. Но это уже совсем другая тема...
-
> функция IPAddrToName меня вполне устраивает
Приведи сюда ее код ..
> теоретический вопрос с синхронизацией большого числа потоков
Теория при этом абсолютна та же самая, что и теория синхронизации малого числа потоков. И если у тебя эта синхронизация не работает или работает не так как положено, значит у тебя ошибка в программе.
|