Java-通过MAC地址查找主机

Java-通过MAC地址查找主机,java,android,network-programming,Java,Android,Network Programming,我有一个Java/Android应用程序,需要向本地网络上的服务器发送一些数据。问题是服务器的ip地址是动态的,所以找到它的唯一方法是通过它的MAC地址进行查找。 这在Java中可能吗?你能看到其他的选择吗 这在Java中可能吗 不是在纯Java中 没有直接将MAC地址映射到IP地址的服务。主机操作系统的网络堆栈使用ARP协议和(在Linux/UNIX上)将IP地址映射到MAC地址。抱歉,不可能从Java使用ARP协议 (在Linux上)您所能做的最好的事情就是将“arpd-l”作为外部命令运行

我有一个Java/Android应用程序,需要向本地网络上的服务器发送一些数据。问题是服务器的ip地址是动态的,所以找到它的唯一方法是通过它的MAC地址进行查找。 这在Java中可能吗?你能看到其他的选择吗

这在Java中可能吗

不是在纯Java中

没有直接将MAC地址映射到IP地址的服务。主机操作系统的网络堆栈使用ARP协议和(在Linux/UNIX上)将IP地址映射到MAC地址。抱歉,不可能从Java使用ARP协议

(在Linux上)您所能做的最好的事情就是将“arpd-l”作为外部命令运行。这将以Java应用程序可以读取和解析的定义良好的格式转储守护进程的ARP映射。如果您的服务器在本地网络上处于活动状态,则其MAC地址将与相应的IP地址一起显示。但是如果它不在本地网络上,那么它的ARP广播将不会到达您的机器,因此守护进程的表中不会有条目



最好为服务器分配一个静态IP地址。。。和一个DNS地址。另一种可能是让服务器使用服务注册自身。

通过MAC地址查找主机只能在本地网络中工作。Mac地址是IP地址下的一层。不存在基于Mac地址到其他网络的路由

广播/多播 如果您正在寻找一种只在本地网络中工作的解决方案,您可以选择收听和发送广播或多播。如果您将数据包发送到广播地址,则本地网络中的每个主机都会收到该数据包,并且可以应答您正在查找的服务器。多播的不同之处在于,只有希望接收发往特定多播地址的数据包的主机才能接收该数据包。如果您使用多播,您需要为您的应用程序选择一个地址,每个客户端将数据包发送到此地址,每个待查找的服务器都侦听此地址。甚至存在一些网络(例如一些大学网络),其中多播数据包被路由到一组有限的其他本地网络

DNS或其他静态服务器 您可以使用具有静态ip地址的第二台服务器来查找动态serevr。当静态服务器的ip地址发生变化时,动态服务器会告诉静态服务器他的ip地址。客户端将向静态服务器询问动态服务器的地址。这种模式适用于整个internet,无论您的动态服务器和客户端位于何处


此静态服务器可以是您的DNS服务器或某个dyndns提供商的DNS服务器。但这并不限于DNS。DNS是为找出如何到达服务/服务器而设计的,但这可以通过任何协议完成。例如,如果您更喜欢web服务,这可以通过您开发的某个http/web应用程序来完成。

只是一点警告:此代码未经测试

尝试挖掘arp缓存,如下所示:

public static String getIpFromArpCache(String macaddr) {
    if (ip == null)
        return null;
    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 && macaddr.equals(splitted[3])) {
                // Basic sanity check
                String ip = splitted[0];
                if (validateIp(ip)) {
                    return ip;
                } else {
                    return null;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

private static final String PATTERN = 
    "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";

public static boolean validateIp(final String ip){          

      Pattern pattern = Pattern.compile(PATTERN);
      Matcher matcher = pattern.matcher(ip);
      return matcher.matches();             
}

修改了

中的例程我怀疑MAC地址查找是否可行,但您不能按主机名连接吗?因此,您可以连接到
www.google.com
,而不是
74.125.237.116
。您可以通过广播,查询MAC
NetworkInterface.getHardwareAddress()
并检查它是否符合标准,即服务器必须是协作的。如果安卓设备真的可以广播,那就另当别论了。@bestsss-那可能行不通。在常规ARP中,您广播IP地址并返回MAC地址。除非服务器实现反向ARP,否则您不能请求MAC地址的IP地址。我指的是包含MAC作为有效负载的常规广播,如果广播已在该MAC上启动,服务器应回复广播(因此是合作的)。只是发现而已。在第二种情况下,虽然残忍的方法也可以做到,但只需像端口扫描程序一样发送到网络中的所有IP。这并不意味着MAC将在本地缓存中。因此,在某些情况下,它可能会工作,但也可能不会。我知道,你是对的,他可能必须在做这件事之前进行多播。我将在周末后测试它并更新答案。