четверг, 15 января 2009 г.

Массовый опрос сети

Иногда бывает нужно найти все машины в сети, слушающие определенный порт TCP. Например, для того, чтобы запустить программу с MPICH (сам по себе MPICH не умеет находить машины). Все машины, на которых стоит и запущен MPICH, слушают один и тот же порт (8675 по умолчанию).
Для начала, нужно найти все машины в сети. Для этого рассылаются ICMP ECHO пакеты. Под *x это делается через сокеты, что требует прав рута. Одна из таких программ - fping. Она компилируется и под Win32 (cygwin, mingw), и тоже требует прав администратора.
Однако, под Win32 все намного проще. Есть специальный API для ICMP, не требующий особых прав. Можно написать что-то типа аналога fping. Вот кусок кода, взятый с АНТИЧАТ:


Вышеупомянутая утилита fping может принимать на вход список IP-адресов, и, сканируя их, выдавать только те, что доступны. Это удобно, и это стоит реализовать в нашем Win32-аналоге fping.
Кстати, Win32-вариант работает раз в 5 быстрее.

А теперь, когда есть список машин, можно к каждой пытаться соединиться на выбранный порт. Одновременно.


Данный скрипт под Win32 может выдать список адресов где-то за 5 секунд. И от ширины канала это особо не зависит.

Есть маленькое неудобство: адреса не сортированы. Если сортировать эти адреса как строки, то, например, адрес 192.168.1.11 будет идти раньше, чем 192.168.1.9. Чтобы не углубляться в преобразования адресов, можно просто сделать сортировку по числу после последней точки, то есть:


Очевидно, что если адреса будут отличаться на 2 разряда и больше, такой способ не пойдет.
  • rss
  • Del.icio.us
  • Digg
  • Twitter
  • StumbleUpon
  • Reddit
  • Share this on Technorati
  • Post this to Myspace
  • Share this on Blinklist
  • Submit this to DesignFloat

Комментариев нет:

Отправить комментарий

 
Design by BloggerThemes | This template is brought to you by : allblogtools.com