2011-11-26 4 views
5

Ho un'app Java/Android che deve inviare alcuni dati al server su una rete locale. il problema è che l'indirizzo IP del server è dinamico, quindi l'unico modo per trovarlo è il suo indirizzo MAC. È possibile in Java? Riesci a vedere altre opzioni?Java: trovare l'host tramite l'indirizzo MAC

+0

ho i miei dubbi un Mac la ricerca degli indirizzi sarà possibile, ma non potresti connetterti per nome host? Quindi al posto di '74.125.237.116', ti connetteresti a' www.google.com'. –

risposta

0

Questo è possibile in Java?

Non in Java puro.

Nessun servizio che associa direttamente indirizzi MAC a indirizzi IP. Lo stack di rete del sistema operativo del computer host utilizza il protocollo ARP e (su Linux/UNIX) lo ARP daemon per mappare gli indirizzi IP agli indirizzi MAC. AFAIK, non è possibile utilizzare il protocollo ARP da Java.

Il meglio che puoi fare (su Linux) è quello di eseguire "arpd -l" come un comando esterno. Questo scaricherà i mapping ARP del demone in un formato ben definito che la tua app Java può leggere e analizzare. Se il tuo server è attivo sulla rete locale, apparirà il suo indirizzo MAC insieme al corrispondente indirizzo IP. Ma se non si trova sulla rete locale, le sue trasmissioni ARP non raggiungeranno il tuo computer, quindi non ci sarà una voce nelle tabelle del daemon.


Sarebbe meglio assegnare al server un indirizzo IP statico ... e un indirizzo DNS. Un'altra possibilità potrebbe essere quella di registrare il server stesso utilizzando un servizio Dynamic DNS.

+0

puoi farlo via broadcast, interrogando il MAC 'NetworkInterface.getHardwareAddress()' e controllando se soddisfa i criteri, cioè il server deve essere cooperativo. È un'altra storia se il dispositivo Android può effettivamente trasmettere. – bestsss

+0

@bestsss - che probabilmente non funzionerà. Nell'ARP regolare, si trasmette l'indirizzo IP e si recupera l'indirizzo MAC. A meno che il server non implementa Inverse ARP - http://tools.ietf.org/html/rfc2390 - non è possibile richiedere l'indirizzo IP per un indirizzo MAC. –

+0

Intendo una trasmissione regolare che contiene il MAC come payload e il server deve rispondere alla trasmissione a condizione che sia stata avviata su tale MAC (quindi cooperativo). Solo scoperta In un secondo momento, anche se un approccio brutale può fare, basta inviare a tutti gli IP della rete come Port Scanner. – bestsss

2

Trovare un host tramite l'indirizzo MAC può funzionare solo nella rete locale. Gli indirizzi Mac sono uno strato sotto Indirizzi IP. Non esiste routing basato su indirizzi Mac su altre reti.

Broadcast/Multicast

Se siete alla ricerca di una soluzione che funziona solo in rete locale, in ascolto su e l'invio per trasmettere o multicast può essere un'opzione per voi. Se si invia un pacchetto a un indirizzo di broadcast, ogni host nella rete locale riceve questo pacchetto e può rispondere se è il server che si sta cercando. Multicast differisce concettualmente in, che solo gli host che vogliono ricevere pacchetti che sono indirizzati a uno specifico indirizzo mulitcast ricevono questi pacchetti. Se si utilizza Multicast è necessario selezionare un indirizzo per la propria applicazione, ogni client invia pacchetti a questo indirizzo, ogni server che si trova in ascolto su questo indirizzo. Esiste anche qualche rete (per esempio alcune reti universitarie), dove i pacchetti multicast vengono instradati verso un insieme limitato di altre reti locali.

DNS o un altro server statico

si potrebbe utilizzare un secondo server con un indirizzo IP statico che si usa per trovare il vostro serevr dinamica. Il tuo server dinamico dovrebbe dire al tuo server statico il suo indirizzo IP ogni volta che cambia. Il client chiede al server statico l'indirizzo del server dinamico. Questo modello funziona su Internet, nomatter in cui sono server e client dinamici.

Questo server statico potrebbe essere il vostro server DNS o un server DNS di alcuni provider di DynDNS. Ma questo non è limitato al DNS. Il DNS è progettato per scoprire come raggiungere servizi/server, ma questo potrebbe essere fatto su qualsiasi protocollo. Ad esempio, se si preferiscono i servizi Web, ciò potrebbe essere fatto tramite alcune applicazioni http/web sviluppate da voi.

2

Solo un piccolo avvertimento: questo codice non è testato,

Prova a scavare nella cache arp, in questo modo:

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

di routine Modificato da here

+0

non significa che il MAC si troverebbe nella cache locale. Quindi in alcuni casi potrebbe funzionare ma potrebbe anche non esserlo. – bestsss

+0

Lo so, hai ragione, probabilmente deve fare un multicast prima di farlo. Lo proverò dopo il fine settimana e aggiornerò la risposta. – Reno