2017-01-24 5 views
0

현재 연결되어있는 네트워크에 연결된 장치를 검색하려고합니다. 모든 장치에 핑을 보내고 "도달 가능한"값을 확인합니다. 여기에 ping 응답을 확인하면서 IP를 통해 순환, 그에 대한 책임의 코드 조각입니다 : 어떤 이유Java에서 ping 명령을 실행하여 네트워크에서 장치 검색

 for (int i = 1; i <= 254; i++) { 
      String addr = IPAddress; 
      addr = addr.substring(0, addr.lastIndexOf('.') + 1) + i; 
      InetAddress pingAddr = InetAddress.getByName(addr); 

      //skips the IP of 'this' device 
      if (pingAddr.getHostAddress().equals(IPAddress)) { continue; } 

      try { 

       //ping command 
       Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 -w 1 " + addr); 
       boolean reachable = (p1.waitFor() == 0); 
       if (reachable) { 
        //add to list, if reachable 
        addrs.add(pingAddr); 
       } 

      } catch (IOException ex) { 
      } catch (InterruptedException ex) { 
      } 
     } 

,이 코드 조각은 일부 장치를 감지합니다. 나는 3 대의 랩톱, 2 대의 안드로이드 장치 및 1 대의 PC를 테스트했습니다. 이 중 3 대의 노트북 중 2 대가 안드로이드 장치를 성공적으로 감지하고 PC를 감지하지 못합니다. 명령에서 "-w 1"을 확인할 수 있습니다. 설정을 100으로 변경했는데 변경하기 만하면 시간이 오래 걸리고 같은 장치가 발견되었습니다.

나는 이미이 방법을 시도 :

INetAddress.isReachable(int timeout); 

을하지만 이후 더 악화되어 - 내가 발견 적어도 무엇을 - 그것은 모든 장치가 (단지 내 안드로이드 장치에 응답 TCP 에코를 사용했다).

또한 핑이 실제로 느립니다. 이미 4 개의 스레드로 나누었지만 여전히 속도 향상을 사용할 수 있습니다.

마지막 질문 : 핑 명령이 모든 장치를 감지 할 수없는 이유는 무엇입니까 & 내 목표를 달성하기 위해 생각할 수있는 다른 방법이 있습니까?

답변

2

PC가 방화벽 뒤에있을 수 있습니까? 수동으로 Ping 할 때 응답합니까?

성능 향상을 위해 -이 시도 :

for (int i = 1; i <= 254; i++) { 
     String addr = ipLocal; 
     addr = addr.substring(0, addr.lastIndexOf('.') + 1) + i; 
     InetAddress pingAddr = InetAddress.getByName(addr); 

     //skips the IP of 'this' device 
     if (pingAddr.getHostAddress().equals(ipLocal)) { continue; } 


     String[] command = {"CMD", "/c", "ping -n 1 -w 1 " + addr}; 
     ProcessBuilder probuilder = new ProcessBuilder(command); 
     Process process = probuilder.start(); 

     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     while ((line = br.readLine()) != null) { 
      CharSequence stats = "Packets: Sent = 1, Received = 1"; 
      if(line.contains(stats)){ 
       System.out.println(line); 
       System.out.println(addr); 
       //add to list, if reachable 
       //addrs.add(pingAddr); 
      } 
     } 
    } 
+0

유용한 답을 보내 주셔서 감사합니다. 다른 장치 (동일한 OS)가 방화벽 뒤에 있기는하지만 방화벽은 실제로 "문제"였습니다. 코드를 업데이트 해 주셔서 감사합니다. 그러나 방화벽 뒤에 이러한 장치를 찾는 방법이 있습니까? 이 코드는 일부 회사 네트워크에서 유용하게 사용하려면 해당 네트워크에서 장치를 찾을 수 있어야합니다. 그렇지 않은 경우이 질문에 동의로 표시합니다. –

+0

라우터에 액세스하면 연결된 컴퓨터에 대한 정보를 얻을 수 있습니다. 두 번째 아이디어는 nslookup 명령을 시도하는 것입니다. – BuMcha

+0

더 나은 성능을 위해 나를 보낸 코드를 업데이트했습니다. 그러나이 예외가 발생합니다 : I/System.out : java.io.IOException : exec() 실행하는 동안 오류가 발생했습니다. 명령 : [CMD,/c, ping -n 1 -w 1 192.168.1.245] 작업 디렉토리 : null 환경 : (너무 오래두고 ..) –

0

일부 컴퓨터 때문에 (@BuMcha가 언급 한 바와 같이) 방화벽 뒤에있는 나 때문에 자신의 설정으로 핑에 응답하지 않습니다. 방화벽과 개별 시스템을 제어 할 수 있다면 모든 곳의 설정을 조정하여이 문제를 해결할 수는 있지만 가능성이 있습니다.

메시지 대신 Address Resolution Protocol (ARP) 메시지를 보낼 수도 있습니다. 그것들은 아마도 방송을 할 것이지만, 당신이 원하는 정보를보다 확실한 방법으로 얻을 수있게 할 것입니다. Java에서 이들을 전송하는 방법을 잘 모르겠습니다. 그러나이 다른 질문은 그 특유의 점을 다루는 것으로 보입니다. Is there a way to send ARP request via Java?