2013-12-15 109 views
2

我一直在閱讀以編程方式獲取我的手機上連接到我的WIFI熱點的設備列表的主題。以編程方式刷新ARP表

我發現了一個useful post on stack overflow用下面的代碼和註釋說

這是不正確的ARP表不一定刷新 設備斷開連接時。有人說,你可以簡單地ping表中的所有設備,看看哪些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

僅供參考:您可以控制ARP緩存時間。請參閱'/ proc/sys/net/ipv4/neigh/eth0/gc_stale_time' – BraveNewCurrency

1

即使icmp迴應請求隨後被阻止,Ping也可能經常執行其arp請求並從活動主機獲取arp回覆。因此,在某些情況下,ping可以用於填充arp表,以便檢查它是否存在網絡存在,即使icmp正被主動阻止。

但是,如果這不夠準確或感覺過於粗糙,則可以使用arp協議直接映射網絡存在,而不涉及棧中較高的協議,這些協議存在被阻塞的較高風險。

arping是常用於手動arp級別操作(在Linux上)的Linux實用程序。

Here是arping的源代碼。

通過快速搜索,看起來有Android的實用程序執行相應的操作,我還發現source code which seems to be for arping on Google Android BusyBox

arping實用程序可以按原樣使用,當然假設您確保它在您的手機上。或者,代碼變體中的一個或兩個可以用作關於如何在您自己的代碼中以編程方式解決問題的靈感。

相關問題