Конференция "Сети" » Проблема с потоками сканирования [WinXP]
 
  • bvv (17.09.09 14:57) [0]
    Знатоки!
    Написал программу сканирования сети.
    Для сокращения времени сканирования разбил проверку адресов IP на потоки, если результаты поиска по каждому потоку выводить в свой файл проблем никаких. Если результаты поиска записывать во временный массив простая синхронизации потоков работает только при небольшом количестве потоков. Критические секции немного улучшают ситуацию, но поиск в 256 потоков находит число IP-адресов гораздо больше чем с 1792 потока, переход на Mutex проблемы не решает и оптимальным числом потоков остаётся ~512. Mutex используется только при завершении работы потока для записи результатов поиска в общий массив, да и то, для каждого потока организован свой раздел в массиве, в который нет доступа другим потокам. Процессор двух ядерный.
    Всё процессорное время, во время сканирования, съедают Svchost и Acs.
    Почему происходят такое различие результатов поиска, если число потоков отличается в три раза, если верить теории этого быть не должно.

    С благодарностью Вл.
  • Сергей М. © (17.09.09 15:13) [1]
    И куда столько потоков ?
    Очуметь же можно - аж под две тысячи)
    Хотя для решения задачи с неменьшей эффективностью вполне хватит и дюжины)
  • bvv (17.09.09 15:45) [2]
    Основное время тратится на ожидание ответа, если сеть класса В и занято много адресов, время сканирования десятки минут, если свободных адресов большая часть это Часы, даде при 512 потоках.
  • Сергей М. © (17.09.09 16:41) [3]

    > время тратится на ожидание ответа


    Ну так ведь поток, получивший ответ, можно тут же напрячь пинговать следующий адрес..

    А пинг-то какими средствами ? raw sockets или wininet-интерфейс ?
  • bvv (17.09.09 16:44) [4]
    Так ведь я так и делаю, каждый поток пингует свой диапазон адресов.
  • Anatoly Podgoretsky © (17.09.09 16:52) [5]
    > bvv  (17.09.2009 16:44:04)  [4]

    Не очень верно, пусть поток сканирует только один адрес, тогда быстрее будет. 256 потоков достаточно, для блока С, а к нему можно привести и В и С.
    По сути получается почти равное время, что для одного потока.
  • bvv (17.09.09 17:03) [6]
    Для С сети проблем вообще никаких нет, если В сетку сканировать как последовательный ряд С сетей, судя по всему Вы правы, но тогда каждый раз нужно создавать и гасить новые потоки, а это время. Гораздо проще, весь диапазон разбить на равные отрезки, и на каждый отрезок создать свай поток, это ничему не противоречит, поскольку в каждом потоке не проверяется больше одной станции, и мы не выходим за предельное число потеков в одном процессе, кроме того, если каждый поток записывает результаты поиска в свой файл, тогда здесь даже синхронизация потоков не нужна, всё на Ура проходит.
  • Сергей М. © (17.09.09 17:04) [7]

    > каждый поток пингует свой диапазон адресов


    А пинговать он должен один адрес, который ему выдаст диспетчер.
    Т.е. поток получил адрес, выполнил пинг, отчитался диспетчеру о результатах пинга и ждет получения след.адреса.
  • bvv (17.09.09 17:12) [8]
    Естественно один, цикл выбирает по одному адресу, и пока не получен ответ на адрес, следующий пинг не начнётся, тоже и с Файлами, но там я для записи результата открывал файл,  записывал и закрывал. с массивом этого делать не нужно а это выигрыш по времени.
  • Сергей М. © (17.09.09 17:24) [9]
    На вопрос в [3] ответишь ?
  • bvv (17.09.09 17:34) [10]
    Сергей, я не не знаю что значит [3] т.к. на форум пришёл впервые, да если честно то и потоками занимаюсь недавно, прочитал и решил модернизировать свою программу, и тут же фэйсом об тэйбол.
  • Сергей М. © (17.09.09 19:34) [11]
    При чем здесь потоки ?
    Я о пинге, а не о потоках ..
  • bvv (18.09.09 08:38) [12]
    Сергей, извините, вчере пришлось срочно убегать.
    Поиск станци в сети выполняется функцией IPAddrToName
    В старой программе для поиска невидимых станций исполь зовался ещё и сокет, но это к делу не относится.
  • Сергей М. © (18.09.09 08:48) [13]

    > Поиск станци в сети выполняется функцией IPAddrToName


    Что за ерунда ?
    Даже по названию ф-ции следует, что она предназначена совсем для иной задачи.
    И откуда она у тебя взялась ?
    Сдул неглядя из
    http://www.google.ru/search?q=IPAddrToName&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox
    ?)


    > для поиска невидимых станций исполь зовался ещё и сокет


    Каких таких "невидимых" ?
    И куда делся сокет в "новой программе" ?)


    > это к делу не относится


    Это к делу относится самым прямым образом.
  • bvv (18.09.09 09:30) [14]
    Сдул конечно, любая вещь гдде нибудь сдувается дорабатывается и снова сдувается.
    Перебирая в цикле адреса определяю наличие станций если есть имя значит есть станция.
    Любая проверка наличия станции в сети, так или иначе связана с установкой связи с ней, (если конечно не берётся готовая таблица станций) связь осуществляется соединением по порту, на некоторых станциях может быть запрещён отклик на запрос IPAddrToName, но если станция в сети, значит у неё должен быть открыт как минимум один порт. С помощью сокета можно это зделать, и делалось, но сейчас главной задачей было разобраться с работой потоков, и поиск другиз станций меня пока не интересует. Но в принципе я могу решить задачу сканирования станции обойдясь без всякой синхронизации потоков, просто записывая результаты проверки во временные файлы а после тойже программой считывать сних информацию и обрабатывать её. Это даже решит другую проблему передачи информации из одного процесса в другой без всяких симафоров и Мьютексов, но хотелось разобраться с синхронизацией. Вопрос чисто теоретический, греть процессор никому ненужными синусами для рассмотрения этой проблемы - себя не уважать, вот и занимаюсь извращенияви в сети, а заодно и частично восполню пробел в знаниях.
  • Сергей М. © (18.09.09 09:46) [15]

    > если есть имя значит есть станция


    Вот уж глупости.
    Наличие зарегистрированного в обратной зоне DNS имени хоста ниак не связано с активностью и/или доступностью этого хоста.


    > связь осуществляется соединением по порту


    Хост не обязан отвечать на запросы на соединение по интересующему тебя порту, равно как и на ping-пакеты, и это ничуть не мешает ему присутствовать в сети.


    > на некоторых станциях может быть запрещён отклик на запрос
    > IPAddrToName


    Эта ф-ция не обращается к "станциям", у нее иное назначение, см.выше (DNS)


    > если станция в сети, значит у неё должен быть открыт как
    > минимум один порт


    С какого это перепугу "должен быть" ?
    Это зависит от того как станция сконфигурирована, так что она вовсе не обязана быть чем-то должна твоему сканеру.

    Ты пойми главное - не существует и не может существовать ни одного алгоритма, позволяющего со 100%-ной достоверностью определить факт присутствия узла в сети.
  • Сергей М. © (18.09.09 09:49) [16]
    Обнаружить в сети хост можно только если этого захочет администратор хоста.
    Ну или по недосмотру или раздолбайству этого администратора)
  • Сергей М. © (18.09.09 09:59) [17]

    > Сдул конечно


    Ну так надо было вникнуть в то что сдул, а не слепо верить в волшебные возможности сдутого)
  • bvv (18.09.09 10:02) [18]

    > Ты пойми главное - не существует и не может существовать
    > ни одного алгоритма, позволяющего со 100%-ной достоверностью
    > определить факт присутствия узла в сети.

    Так я с этим и не спорю, 100% гарантия может быть только по свершившемуся факту, (Машина врералась в дерево) это может не говорить о причинах свершившегося факта, но он либо есть либо нет.
    Я не ставлю перед собой задачу 100% поиска станций, и не собираюсь заниматься их взломом, (Дорожу своим рабочим местом). Я говорю, это чисто теоретический вопрос с синхронизацией большого  числа потоков, поэтому данная функция IPAddrToName меня вполне устраивает, пусть прячутся и правильно делают, а то иногда встречаются станции с расшаренным С диском и даже Program Files нараспашку...
    Иногда ставлю их в известность об этом, но чаще просто оставляю как есть, пусть сами разбираются, причём не только у нас но и за бугром такое бывает. Но это уже совсем другая тема...
  • Сергей М. © (18.09.09 10:18) [19]

    > функция IPAddrToName меня вполне устраивает


    Приведи сюда ее код ..


    > теоретический вопрос с синхронизацией большого  числа потоков


    Теория при этом абсолютна та же самая, что и теория синхронизации малого числа потоков.
    И если у тебя эта синхронизация не работает или работает не так как положено, значит у тебя ошибка в программе.
 
Конференция "Сети" » Проблема с потоками сканирования [WinXP]
Есть новые Нет новых   [134437   +29][b:0][p:0.001]