| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Распределённые приложения и сеть > Определить включен ли компьютер в локальной сети |
| Автор: Turanda 2.11.2010, 11:50 | ||
| В принципе тема не новая тут, но подходящего не нашел поэтому решил создать тему. Проблема в том что нужно просканировать локальную сеть по IP и узнать какие включены. сейчас делаю это так:
Но это работает очень медленно причем, если хост недоступен то проверка его длится еще дольше. Есть такая программа Xspider сканер безопасности, ну или другие сканеры сетей, вот интерестно как у них организовано сканирование, т.к. упомянутый спайдер сканит за 3 секунды весь диапазон. Как такого же добиться? |
| Автор: gambit 2.11.2010, 12:06 |
| Turanda, возможно вариант безумный, я не спец в сетях, но он пришел в голову первым. Пинг. Ответили - работаем, не ответили за секунду, значит выключен. Массового разослать пинг по сети, прослушать ответы, сделать вывод кто включен, а кто нет |
| Автор: Turanda 2.11.2010, 12:32 | ||
вот получалось теперь так:
Да добавил время стало намного быстрей, можно сказать наверное даже что проблема решена |
| Автор: mihryak 2.11.2010, 13:43 | ||
| сейчас меня gambit заклюёт, но советую взглянуть на интеропные функции - и возможностей больше, и скорость куда выше ещё такая таска отлично параллелится, можно создать кучу потоков для проверки компов ну и я тут попробовал идти не от адресов, а от имеющих компов - это избавит от проверок заведомо недоступных машин, т.е. получаю список компов, а там уже можно проверить его адреса на вхождение в диапазон такой код в приличном домене отрабатывает за 99мс:
|
| Автор: mihryak 2.11.2010, 17:15 |
да как-то уже накинулся на меня со словами, что интероп - это не тру в шарпе с чего? |
| Автор: gambit 2.11.2010, 17:23 | ||
mihryak,
если имеется ввиду вот эта тема - http://forum.vingrad.ru/forum/topic-306772/kw-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80/view-all.html ну не сказать что я накинулся, просто высказал мнение о том, что без этого можно обойтись. Не знаю, может это моя личная неприязнь, но я буду как уж выворачиваться, но на интеропные функции не посмотрю. |
| Автор: mihryak 2.11.2010, 18:58 |
| Ну вот на более серьёзном диапазоне (192.168.0.0-192.168.255.255) у меня компы проверились за 3.5 секунды, а твой вариант (без распараллеливания, правда, - у меня его нет) ушёл в астрал минут 10 назад, по пути несколько раз завалившись на определении имени компа по адресу, не знаю, что там происходит сейчас И, заодно, я не знаю, как исключительно средствами фрейворка радикально увеличить скорость, разве что wmi, да и тот ведь ни разу не .нет. Кроме того, вариант с пингом - не самый удачный, пинг может не пропускаться файрволом (впрочем, network discovery сервис может тоже быть вырублен). |
| Автор: mrbrooks 3.11.2010, 09:46 | ||
ping хорош в единичном случае, но использовать его в цикле я бы определенно не стал. на мой взгляд - решение mihryak кошернее, хотя я бы двигался в сторону wmi.
порою от нативных библиотек не уйти. изощренные вывороты могут положить производительность на лопатки. |
| Автор: Turanda 3.11.2010, 10:42 |
| to mihryak А где в вашем коде указывается диапазон IP адресов? P.S. Чет ни как не могу понять :( А так запустил код, единственное что выдал: Elapsed time: 33342. я не очень долго ждал. |
| Автор: gambit 3.11.2010, 10:54 | ||||
Конкретно в данном случае, я не оспариваю, я изначально написал, что идея бредовая. Если возможно, протести пож. вариант с распараллеливанием. По логике он должен быть координально быстрее, так как будут запускаться все новые потоки, которые проц не напрягают, а просто ждут ответа. В случае с одним потоком, он ждет ответ от каждого компа, и только потом отправляет следующему.
Это да, но как то душа не лежит((( |
| Автор: KortenevStas 20.3.2011, 02:37 |
| У меня стоит VS2005. NetworkInformation space не доступно. Надо отдельно Reference подключать? |