2011-11-26 29 views
5

Tengo una aplicación Java/Android que necesita enviar algunos datos al servidor en una red local. El problema es que la dirección IP del servidor es dinámica, por lo que la única forma de encontrarla es mediante su dirección MAC. ¿Es esto posible en Java? ¿Puedes ver otras opciones?Java - encuentre el host por la dirección MAC

+0

tengo mis dudas un MAC La búsqueda de direcciones será posible, pero ¿no podría conectarse por nombre de host? Entonces, en lugar de '74.125.237.116', te conectarías a' www.google.com'. –

Respuesta

0

¿Es esto posible en Java?

No en Java puro.

No hay ningún servicio que asigne directamente las direcciones MAC a las direcciones IP. La pila de red del sistema operativo de su computadora host utiliza el protocolo ARP y (en Linux/UNIX) el ARP daemon para asignar direcciones IP a direcciones MAC. AFAIK, no es posible usar el protocolo ARP de Java.

Lo mejor que puede hacer (en Linux) es ejecutar "arpd -l" como un comando externo. Esto descargará las asignaciones ARP del daemon en un formato bien definido que su aplicación Java puede leer y analizar. Si su servidor está activo en la red local, su dirección MAC aparecerá junto con la dirección IP correspondiente. Pero si no está en la red local, entonces sus transmisiones ARP no llegarán a su máquina, por lo que no habrá una entrada en las tablas del daemon.


Sería mejor asignar a su servidor una dirección IP estática ... y una dirección DNS. Otra posibilidad sería hacer que el servidor se registre utilizando un servicio Dynamic DNS.

+0

puede hacerlo a través de difusión, consultando MAC 'NetworkInterface.getHardwareAddress()' y comprobando si coincide con los criterios, es decir, el servidor tiene que ser cooperativo. Es otra historia si el dispositivo Android realmente puede transmitir. – bestsss

+0

@bestsss - eso probablemente no funcionará. En ARP regular, transmite la dirección IP y recupera la dirección MAC. A menos que el servidor implemente ARP Inverso - http://tools.ietf.org/html/rfc2390 - no puede solicitar la dirección IP para una dirección MAC. –

+0

Me refiero a una transmisión regular que contiene el MAC como carga útil y el servidor responderá a la transmisión siempre que se haya iniciado en ese MAC (por lo tanto, cooperativo). Solo descubrimiento. En segundo lugar, aunque un enfoque brutal también puede hacer, simplemente envíe a todos los IP en la red como escáner de puerto. – bestsss

2

Encontrar un host por dirección MAC solo puede funcionar en su red local. Las direcciones Mac son una capa debajo de direcciones IP. No existe enrutamiento basado en direcciones de Mac a otras redes.

Broadcast/Multicast

Si usted está buscando una solución que sólo funciona en red local, escuchando en el envío y la radiodifusión o multidifusión puede ser una opción para usted. Si envía un paquete a una dirección de difusión, cada host de la red local recibe este paquete y puede responder si es el servidor que está buscando. La multidifusión difiere conceptualmente en, que solo los hosts que desean recibir paquetes que están dirigidos a una dirección mulitcast específica reciben estos paquetes. Si está utilizando Multicast, debe elegir una dirección para su aplicación, cada cliente envía paquetes a esta dirección, cada servidor encontrado se escucha en esta dirección. Existe incluso alguna red (por ejemplo, algunas redes universitarias), donde los paquetes de multidifusión se enrutan a un conjunto limitado de otras redes locales.

DNS u otro servidor estática

Se puede usar un segundo servidor con una dirección IP estática que se utiliza para encontrar su serevr dinámico. Su servidor dinámico le diría a su servidor estático su dirección IP cada vez que cambie. Su cliente le pediría al servidor estático la dirección del servidor dinámico. Este patrón funciona en toda la red, nomatter donde están el servidor y el cliente dinámico.

Este servidor estático podría ser su servidor DNS o un servidor dns de algún proveedor de dyndns. Pero esto no está limitado a DNS. El DNS está diseñado para descubrir cómo llegar a los servicios/servidores, pero esto podría hacerse a través de cualquier protocolo. Por ejemplo, si prefiere los servicios web, esto podría hacerse a través de alguna aplicación http/web desarrollada por usted.

2

Sólo una pequeña advertencia: este código no se ha probado,

Trate de cavar en la caché ARP, así:

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();    
} 

rutina Modificado de here

+0

no significa que el MAC estaría en el caché local. Por lo tanto, en algunos casos podría funcionar, pero también podría no funcionar. – bestsss

+0

Lo sé, tienes razón, probablemente tenga que hacer una multidifusión antes de hacer esto. Lo probaré después del fin de semana y actualizaré la respuesta. – Reno

Cuestiones relacionadas