2009-11-17 3 views
4

Учитывая диапазон IP-адресов, введенных пользователем (с помощью различных средств), я хочу определить, какие из этих машин имеют программное обеспечение, с которым я могу поговорить.Правильный способ сканирования диапазона IP-адресов

Вот основной процесс:

  1. пинг этих адреса, чтобы найти доступные машины

  2. Подключения к известному гнезду на доступных машинах

  3. Отправить сообщение для успешно установленных розеток

  4. Сравните ответ на ожидаемый ответ

Шаги 2-4 предназначены для меня. Каков наилучший способ реализовать первый шаг в .NET?

Я изучаю класс System.Net.NetworkInformation.Ping. Должен ли я выполнять несколько адресов одновременно для ускорения процесса? Если я пингую один адрес за раз с длинным таймаутом, это может занять много времени. Но с небольшим таймаутом я могу пропустить несколько доступных машин.

Иногда pings, кажется, терпят неудачу, даже когда я знаю, что адрес указывает на активную машину. Нужно ли дважды пингу в случае отказа от запроса?

Прежде всего, когда я сканирую большие коллекции адресов с отключенным сетевым кабелем, Ping выдает исключение NullReferenceException в FreeUnmanagedResources(). !?

Любые указатели на лучший подход к сканированию ряда IP-адресов, подобных этому?

+0

Я все еще возникают проблемы с пинги ненадежны, но я не смог реализовать ответы, предложенные здесь, потому что они слишком много времени потребляя. –

ответ

4

Поскольку не все машины отвечают на пинги (в зависимости от брандмауэра настройки) Я предлагаю пропустить шаг 1, если это возможно.

Если вы знаете машины, с которыми будете подключаться, чтобы отвечать на звонки, класс ping работает достаточно хорошо. Он отправляет только 1 пакет, поэтому ping более одного раза в случае его падения. Кроме того, по моему опыту, класс ping часто генерирует исключение вместо возврата объекта PingReply, если хост недоступен.

Это моя рекомендованная реализация:

public bool 
    Ping (string host, int attempts, int timeout) 
    { 
     System.Net.NetworkInformation.Ping ping = 
             new System.Net.NetworkInformation.Ping(); 

     System.Net.NetworkInformation.PingReply pingReply; 

     for (int i = 0; i < attempts; i++) 
     { 
     try 
     { 
      pingReply = ping.Send (host, timeout); 

      // If there is a successful ping then return true. 
      if (pingReply != null && 
       pingReply.Status == System.Net.NetworkInformation.IPStatus.Success) 
       return true; 
     } 
     catch 
     { 
      // Do nothing and let it try again until the attempts are exausted. 
      // Exceptions are thrown for normal ping failurs like address lookup 
      // failed. For this reason we are supressing errors. 
     } 
     } 

     // Return false if we can't successfully ping the server after several attempts. 
     return false; 
    } 
4

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

Мое единственное предложение - возможно, вопрос: вам нужно сделать # 1?

Не можете ли вы просто попытаться подключиться к этому известному сокету? Успешное подключение к этому гнезду убивает двух птиц одним камнем: да, хозяин там/жив, и да, известная розетка открыта.

Этот тип ситуации действительно поддается хорошо многопоточности, огонь его в другом потоке, и ждать его, чтобы вернуться с ответом ...

+0

Единственная проблема с этим подходом - это время. Если диапазон адресов составляет 256 + адресов, можно ли попытаться открыть сокет для каждого из них? Как долго будет время ожидания? Могу ли я попытаться открыть сразу несколько сокетов? –

+0

Вы можете, например, сделать 4 асинхронных сокета и начать пытаться подключиться к машинам, таким образом вы можете попробовать по 4 подключения одновременно. Добавьте столько сокетов, сколько хотите! – DaMacc

+0

Единственная проблема заключается в том, что ping ненадежен из-за брандмауэров и т. Д. Единственная альтернатива - полностью пропустить ее. Я бы, вероятно, пошел с чем-то вроде @DaMacc, предлагая - просто нитки N-потоков одновременно ... – Yoopergeek

-3

Звучит подозрительно, как кто-то пытается написать ботнет и сканирование подсетей для зараженных компьютеров.

Вряд ли когда-либо возникает причина «обнаруживать компьютеры в сети», пусть они говорят с вами, когда и если захотят.

+0

На самом деле это инструмент настройки для аппаратных устройств. Я пытаюсь определить, где находятся устройства. Наличие устройств со мной не изменит проблему. Они будут случайным образом пинговать, чтобы найти конфигурационный ПК, как это делает ПК с настройками. –

0

Как многие люди упомянули, что Ping - это не лучший способ определить, жив ли компьютер, если требуется абсолютное обязательное обнаружение всей доступной машины в подсети, вы можете использовать некоторые из трюков, которые использует сканер nmap, для обнаружения доступные машины.

Вы couuld использовать nmap -sP 192.168.2.1-200 для сканирования 192.168.2.0 до 192.168.2.255

+1

как? какие трюки? – Maslow

+0

Вы можете использовать nmap -sP 192.168.2.1-200 для сканирования 192.168.2.0 до 192.168.2.255 – Vitalij

+1

нормально, но это вопрос о том, как делать то же самое в C#, поэтому я спрашивал, можете ли вы пролить свет на как трюки nmap связаны с этим в C#? – Maslow

Смежные вопросы