2013-12-15 7 views
2

Я читал тему получения списка устройств, подключенных к моей горячей точке WIFI на моем телефоне программно.Программно обновить таблицы ARP

Я нашел useful post on stack overflow со следующим кодом и комментарием говоря

Это неверно, так как таблицы ARP не обязательно обновлять, когда отключает устройство. Скажем, скажем, что вы можете просто пинговать все устройства в таблице, чтобы увидеть, какие IP-адреса активны, но вполне возможно, что устройство брандмауэром не отвечает на запрос ICMP , и ваш ping завершится с ошибкой. Это решение, хотя и работающее, не является надежным и точным.

Мне было интересно, если чтение proc/net/arp недостаточно точным из-за проблем с обновлением, как вы можете заставить систему сделать обновление, чтобы получить точные данные?

private int countNumMac() 
{ 
    int macCount = 0; 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] splitted = line.split(" +"); 
      if (splitted != null && splitted.length >= 4) { 
       // Basic sanity check 
       String mac = splitted[3]; 
       if (mac.matches("..:..:..:..:..:..")) { 
        macCount++; 
       } 
      } 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
      br.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    if (macCount == 0) 
     return 0; 
    else 
     return macCount-1; //One MAC address entry will be for the host. 
} 

ответ

3

Таблица ARP не является распределенным списком «хостов, которые находятся в сети». Это локальный список «хостов, которые мы видели в этой сети».

Как только вы это осознаете, вы заметите, что нет способа удалить записи, если кто-то отключится, кроме как пытаться подключиться к ним. Просто используйте непрерывный цикл в фоновом режиме, подключаясь к каждому хосту и отправляя один ICMP-пакет (вроде бы трудно выйти из Java, но Android поставляется с инструментом командной строки ping).

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

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

+2

FYI: Вы можете управлять временем кэширования ARP. См. '/ Proc/sys/net/ipv4/neigh/eth0/gc_stale_time' – BraveNewCurrency

1

Ping может часто выполнять запрос arp и получать ответы arp от активных хостов, даже если запрос эхо-сигнала icmp впоследствии блокируется. Поэтому ping может в некоторых случаях использоваться для заполнения таблицы arp, чтобы проверить его на наличие сети, даже если icmp активно блокируется.

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

arping - утилита Linux, обычно используемая для операций ручного управления уровнем arp (в Linux).

Here является исходным кодом для арпинга.

С помощью быстрого googling появляется утилиты для Android, которые выполняют соответствующие операции, я также нашел source code which seems to be for arping on Google Android BusyBox.

Утилита arping может использоваться как есть, предполагая, конечно, что вы обеспечиваете ее присутствие на вашем телефоне. Альтернативно один или оба варианта кода могут служить источником вдохновения для того, как проблема может быть программно решена в вашем собственном коде.

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