2014-11-26 2 views
0

Я пытался обнаружить любое устройство (рабочий стол, мобильный телефон, планшет и т. Д.), Который входит в корпоративную сеть. Это очень грязный код, который я написал. Код постоянно проверяет подключенные устройства и печатает новые, проверяя набор.Как обнаружить устройства, регистрирующиеся в сети?

public class DeviceDetectAgent { 

    private static Set<String> connectedDevicesPast = new HashSet<String>(); 

    private static void detectNewDevices() { 

     private Set<String> connectedDevicesPresent = new HashSet<String>(); // saves all devices detected in the previous poll 

     InetAddress localhost = InetAddress.getLocalHost(); 
     byte[] iPAddress = localhost.getAddress(); 

     for (int i=1; i<=254; i++) { 

      iPAddress[3] = (byte) i; 
      InetAddress inetAddress = InetAddress.getByAddress(iPAddress); 

      if (inetAddress.isReachable(1000)) { 

       String device = inetAddress.toString(); 
       if (!connectedDevicesPast.contains(device)) { 
        System.out.println("New device " + device + "found."); 
       } 
       connectedDevicesPresent.add(device); 
      } 
     } 

     connectedDevicesPast = connectedDevicesPresent; 
    } 

    public static void main(String[] args) { 

     while (true) { 
      detectNewDevices(); 
      Thread.sleep(1000); 
     } 
    } 
} 

Моя цель - создать агент, который обнаруживает, что устройство регистрируется в сети. Есть ли улучшения в моем коде? Я считаю, что мой код слишком тривиален.

+0

Добро пожаловать в StackOverflow! Вы должны задать вопрос о просмотрах кода через http://codereview.stackexchange.com/. Stackoverflow пытается избежать вопросов, на которых ответ основан на мнении. – Patrick

ответ

1

Ваше решение имеет следующие ограничения.

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

Во-вторых, ваше решение происходит очень медленно. Ping может занять секунду, поэтому вы потратите ~ 4 минуты, чтобы завершить свой цикл. К счастью, эту проблему можно исправить с помощью NIO. Посмотрите на this code в качестве примера или проверьте другие примеры асинхронного пинга.

Фиксация первой проблемы не является тривиальной. Как правило, вы можете думать о 2 стратегии:

  1. попытка обнаружить устройство с помощью других портов и протоколов
  2. пытаются поймать устройство, когда он выполняет какую-то сетевую активность.

Использование других протоколов несколько сложнее. Посмотрите на nmap-инструмент, который уже делает это. Устранение других сетевых действий может быть выполнено с помощью PCAP или если вы реализуете это в java JPCAP. Однако вы должны найти своего шпиона в «правильном» месте в сети. Лучше всего использовать сетевое зеркалирование.

+0

Спасибо AlexR! Существуют ли какие-либо другие решения, помимо того, что они пинговали, чтобы избежать устройства, скрывающегося за брандмауэром, как было упомянуто вами в первом пункте? –

+0

Пожалуйста, взгляните на мой обновленный ответ. – AlexR

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