2015-07-13 4 views
0

я пытаюсь извлечь все узлы, подключенные к маршрутизатору и пытаться контролировать пропускную способность маршрутизатораКак получить список узлов, подключенных к маршрутизатору В Java

int depth = 10;   //Where depth is the range of the ip address 
     int subDepth = 255; // subdepth is the subnet mask of the network 
     int TIMEOUT = 500; // timeout is the maximum wait for another host for the device 
     String ip = InetAddress.getLocalHost().toString().split("/")[1]; 
     String tmp = ip.substring(0, 
       ip.lastIndexOf(".", ip.lastIndexOf(".") - 1)) 
       + "."; 
     ArrayList<InetAddress> lanMachines = new ArrayList<>(); 
     for (int j = 1; j < depth; j++) { 
      for (int i = 1; i < subDepth; i++) { 
       InetAddress a = InetAddress.getByName(tmp + j + "." + i); 
       if (a.isReachable(TIMEOUT)) 
        lanMachines.add(a); 
      } 
     } 

После того, как все детали мне нужно контролировать пропускную способность узлов ..

+0

Что вы подразумеваете под "Connected to router?" Вы хотите сказать, что вам нужен список компьютеров в той же подсети, что и машина, выполняющая эту программу? –

+0

Брат я хочу узнать список машин, подключенных к тому же маршрутизатору, через который я тоже подключен. –

+0

Вы не можете сделать это удаленно. Я отправлю ответ, чтобы объяснить, почему. –

ответ

1

ни одна машина не будет добавлен из-за этого:

for (int j = 1; j < depth; j++) { 

и

int depth=1; 

в первом случае 1<1 является false и для тела цикла не будет выполнено, объявить состояние цикла как folows:

for (int j = 0; j < depth; j++) { 

EDIT

Ваш IP-адрес с префиксом 127,0. xxx.xxx, вы должны запросить у пользователя адресное пространство IP, например 192.168.xxx.xxx:

int depth = 1;   //Where depth is the range of the ip address 
int subDepth = 255; // subdepth is the subnet mask of the network 
int TIMEOUT = 500; // timeout is the maximum wait for another host for the device 
/* 
* User input will be better 
* There exists a way to get LAN ip, but you used 
* localhost address 127.0.0.1 
*/ 
String ip = fromUser; 
String tmp = ip.substring(0, 
      ip.lastIndexOf(".", ip.lastIndexOf(".") - 1)) 
      + "."; 
ArrayList<InetAddress> lanMachines = new ArrayList<>(); 
for (int j = 0; j < depth; j++) { 
    for (int i = 1; i < subDepth; i++) { 
     InetAddress a = InetAddress.getByName(tmp + j + "." + i); 
     System.out.println(tmp + j + "." + i); 
     if (a.isReachable(TIMEOUT)) 
      lanMachines.add(a); 
    } 
} 
for(InetAddress ina: lanMachines){ 
    System.out.println("Found: "+ina.toString()); 
} 
+0

позволяет сказать int depth = 10; еще ни одна машина не добавляет –

+0

Ответа на этот вопрос @tayyabtechventor – maskacovnik

+0

brother i dont must take input от пользователя, которого вы добавили в одно поле String ip = fromUser; Я должен получить все узлы, которые подключены к тому же маршрутизатору, к которому я обращаюсь прямо сейчас. Я думаю, что вы не понимаете моего senerio –

1

Не существует окончательного способа узнать, какие компьютеры используют тот же маршрутизатор, что и ваш IP-адрес. Вам нужно будет проверить сетевые настройки каждой машины (что будет зависеть от конфигурации ОС). Вы, конечно, не сможете ограничить свою пропускную способность от такого рода программ. Чтобы это сделать, вам необходимо изменить правила маршрутизатора и/или брандмауэра.

Машины не поддерживают «соединение» с маршрутизатором постоянно. DHCP-сервер (который может или не может быть маршрутизатором) может содержать список машин, которым он предоставлен, но машины со статическими IP-адресами не будут в этом списке.

Возможно также (хотя и необычно), что более одной машины в подсети может действовать как маршрутизатор в зависимости от назначения пакета.

Например, машины в сети 192.168.0.0/24 может взаимодействовать с сетью 192.168.8.0/24 через маршрутизатор, который имеет два адреса (192.168.0.254 и 192.168.8.254), но общаться с интернета через маршрутизатор на 192.168.0.1. Невозможно обнаружить это поведение без проверки сетевой конфигурации каждой машины. Вы не можете сказать только с IP-адреса.

Теперь, если вы просто хотите узнать, какие машины находятся в одной и той же подсети, вы можете посмотреть свой IP-адрес и сетевую маску вместе, чтобы выяснить адреса для проверки. Это НЕ ОКАЗЫВАЕТ сказать вам, если они используют ваш маршрутизатор, но есть приличный шанс, что они будут.

адреса вы хотите проверить, являются те, между сети адресом (который является вашим диапазоном IP со всеми битами хоста установлен в 0), и ваш вещание адреса (который является IP-диапазон, 're, со всеми битами хоста, установленными в 1).

ПРЕДУПРЕЖДЕНИЕ: В зависимости от среды, следующий код может получить Вас в большой куче очень большие неприятности. Многие сетевые администраторы будут очень недовольны вами, если вы это сделаете, потому что это похоже на предшественницу атаки. Используйте это на свой страх и риск и не забудьте спросить разрешения своего администратора, прежде чем делать это.

Это поможет вам ваш сети адрес и маску подсети (Примечание.. Этот код должен быть IPv6 безопасным я не проверял это в среде IPv6)

InetAddress localhost = InetAddress.getLocalHost(); 
NetworkInterface iFace = NetworkInterface.getByInetAddress(localhost); 
int prefix = iFace.getInterfaceAddresses().get(0).getNetworkPrefixLength(); 
InetAddress bcastAddress = iFace.getInterfaceAddresses().get(0).getBroadcast(); 

int addrSize = localhost.getAddress().length * 8; 

byte[] maskBytes = new byte[localhost.getAddress().length]; 
for (int i = 0; i < prefix; ++i) { 
    maskBytes[i/8] |= 1 << (7 - i % 8); 
} 

byte[] net = Arrays.copyOf(localhost.getAddress(), localhost.getAddress().length); 
for (int i = 0; i < net.length; ++i) { 
    net[i] = (byte)(net[i] & maskBytes[i]); 
} 
InetAddress networkAddress = InetAddress.getByAddress(net); 

Сделав это, вы можете между этими двумя адресами. Все между ними - потенциальный хост в той же подсети.

List<InetAddress> addresses = new ArrayList<InetAddress>(); 
BigInteger bcastNum = new BigInteger(bcastAddress.getAddress()); 
BigInteger workNum = new BigInteger(net).add(BigInteger.ONE); 
while (workNum.compareTo(bcastNum) < 0) { 
    InetAddress toCheck = InetAddress.getByAddress(workNum.toByteArray()); 
    if (toCheck.isReachable(20)) { 
     addresses.add(toCheck); 
    } 
    workNum = workNum.add(BigInteger.ONE); 
} 

Возможно, вы захотите увеличить этот тайм-аут с 20 мс, в зависимости от ваших потребностей.

+1

Если кто-то делает то, что Ян выложил из-за маршрутизатора (брандмауэр), ожидайте вызова от вашего сетевого администратора. –

+0

@ GilbertLeBlanc, да. Вы абсолютно должны ожидать, что суровый разговор поможет сделать это. Это не очень вежливо. –

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