【问题标题】:Refresh ARP tables programmatically以编程方式刷新 ARP 表
【发布时间】:2013-12-15 08:40:38
【问题描述】:

我一直在阅读有关以编程方式在手机上获取连接到我的 WIFI 热点的设备列表的主题。

我找到了一个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.
}

【问题讨论】:

    标签: java android linux networking arp


    【解决方案1】:

    ARP 表不是“在线主机”的分布式列表。这是“我们在此网络上看到的主机”的仅限本地列表。

    一旦您意识到这一点,您就会注意到,当有人断开连接时,除了尝试连接之外,没有其他方法可以删除条目。只是在后台有一个连续的循环,连接到每个主机并发送一个 ICMP 数据包(从 Java 中很难实现,但 Android 确实带有 ping 命令行工具)。

    当然,不回复 ping 的主机将被过滤掉,但取决于可接受的应用程序。

    或者,让用户尝试连接到列出的任何主机,并在对方离线时优雅地超时。这就是大多数网络应用程序所做的事情,也是检查主机是否在线的唯一万无一失的方法。

    【讨论】:

    • 仅供参考:您可以控制 ARP 缓存时间。见/proc/sys/net/ipv4/neigh/eth0/gc_stale_time
    【解决方案2】:

    即使 icmp 回显请求随后被阻止,Ping 也可能经常执行它的 arp 请求并从活动主机获得 arp 回复。因此,在某些情况下,ping 可用于填充 arp 表,以便检查网络是否存在,即使 icmp 正在被主动阻止。

    但是,如果这不够准确或感觉过于粗糙,则可以使用 arp 协议直接映射网络存在,而无需涉及堆栈中较高层的协议,这些协议存在更高的被阻塞风险。

    arping 是 Linux 实用程序,通常用于手动 arp 级别操作(在 Linux 上)。

    Here是arping的源代码。

    通过快速谷歌搜索,似乎有用于执行相应操作的 Android 实用程序,我还找到了source code which seems to be for arping on Google Android BusyBox

    arping 实用程序可以按原样使用,当然前提是您确保它存在于您的手机上。或者,其中一个或两个代码变体可以作为您如何在自己的代码中以编程方式解决问题的灵感。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      相关资源
      最近更新 更多