# Windows vs Linux



## windl (20. Dez 2015)

Hallo liebe Community,

ich habe folgendes Problem was ich nicht verstehe.
Gelernt habe ich einmal, dass Java sowohl auf Windows als auch auf LINUX das gleiche Verhalten liefern sollt.

Der folgende Code wird unter Windows (Java 1.7) ohne Probleme ausgeführt liefert aber unter Linux auf einer Raspberry PI (Java 1.8) nur null zurück.


```
private byte[] getHardwareAdress() {
        byte[] hwAddr = null;
        InetAddress local;
       
        try {
            local = InetAddress.getLocalHost();
            NetworkInterface ni = NetworkInterface.getByInetAddress(local);
           
            if (ni != null)
                hwAddr = ni.getHardwareAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        }
       
        return hwAddr;
    }
```


Es wäre schön,wenn man mir erklären könnte woran es liegt.

Danke
Uwe


----------



## Tobse (20. Dez 2015)

Ich vermute mal, dass das Windows auf deinem PC läuft? Einen normalen Desktop-PC kannst du nicht mit dem Raspberry vergleichen; zumal du auch zwei unterschiedliche Java-Versionen nutzt.

Ich würde mir mal anschauen, welche Rückgabe du von getLocalHost() bekommst. Ich vermute unter Windows ist das deine Lan-IP (z.B. 192.168.1.10) und unter Linux 127.0.0.1. Dieser Unterschied könnte dann auch der Grund für die Unterschiedlichen Rückgabewerte von NetworkInterface#getByInetAddress sein


----------



## windl (21. Dez 2015)

Hallo Tobse,

vielen Dank - genau so verhält es sich. Nun bleibt die Frage, wie bekomme ich aus Linux die Lan-IP wie bei Windows?


----------



## stg (21. Dez 2015)

Eine Erklärung für das Verhalten und mögliche Lösungsansätze sind hier beschrieben:
http://stackoverflow.com/a/9482369/1803294
Einen Implementierungsvorschlag zum ersten Lösungsvorschlag findest du zum Beispiel hier:
http://stackoverflow.com/a/901943/1803294


----------



## windl (21. Dez 2015)

Danke - werde ich heute Abend an der PI gleich ausprobieren.

Gruß
Uwe


----------



## Thallius (21. Dez 2015)

Die Frage ist eigentlich wieso du die programmatisch ermitteln must?


----------



## stg (21. Dez 2015)

Thallius hat gesagt.:


> Die Frage ist eigentlich wieso du die programmatisch ermitteln must?



Weil sie möglicherweise dynamisch ist und automatisch vergeben wird.
Weil man eine Anwendung ausliefern möchte, die auf verschiedenen Maschinen in verschiedenen Netzwerken laufen soll - eventuell auch mehrere Maschinen im selben Netzwerk.


----------



## Thallius (21. Dez 2015)

stg hat gesagt.:


> Weil sie möglicherweise dynamisch ist und automatisch vergeben wird.
> Weil man eine Anwendung ausliefern möchte, die auf verschiedenen Maschinen in verschiedenen Netzwerken laufen soll - eventuell auch mehrere Maschinen im selben Netzwerk.



Dann weiß ich aber immer noch nicht warum ein Programm die IP des eigenen Rechners wissen muss...


----------



## stg (21. Dez 2015)

Naja, vielleicht will man sie einfach anzeigen ... ansonsten natürlich ein berechtigter Einwand. Ein wirklich sinnvoller Anwendungsfall fällt mir gerade auch nicht ein.


----------



## windl (21. Dez 2015)

Hallo Thallius,
dieser Teil ist ein Ausschnitt aus einem Apple-Airserver den ich für meine Belange angepasst habe. Ich verstehe es so, dass das Java-Programm die IP an das Iphone mit überträgt um sich dort als Server zu registrieren.

Zumindest wird es im JMDNS - ServiceInfo.create () mit abgefragt.

Gruß
Uwe


----------



## Tobse (21. Dez 2015)

Auf SO (1. link von stg) wird das ganze schon richtig beschrieben: du kannst alle Netzwerkschnittstellen abfragen und deren IPs abfragen. Hier würde ich folgende Strategie Vorschlagen:

1. Alle Netzwerkschnittstellen abfragen: NetworkInterface#getNetworkInterfaces()
2. Die IP-Adressen jeder Schnittstelle abarbeiten: NetworkInterface#getInetAddresses()
3. Alle rausfiltern, welche LAN IPs sind: 10.*.*.*, 192.168.*.*, 172.16.*.*-172.31.*.*

Wenn dabei mehr als eine übrig bleibt den Benutzer um Mithilfe bitten: einen Dialog o.ä. zeigen, wo die korrekte Adresse ausgewählt werden kann. Ich denke aber dass in 99% der Privaten Netzwerke/Privaten PCs nur eine (oder keine) übrig bleibt.


----------



## windl (22. Dez 2015)

Hallo,
ich habe es gestern Abend getestet und der folgende Code liefert das erwartete Ergebnis.

```
public static String getIpAddress() {
 
    String ipAddress = null;
 
    try {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
 
        while (networkInterfaces.hasMoreElements()) {
 
            NetworkInterface networkInterface = networkInterfaces.nextElement();
 
            byte[] hardwareAddress = networkInterface.getHardwareAddress();
            if (null == hardwareAddress || 0 == hardwareAddress.length || (0 == hardwareAddress[0] && 0 == hardwareAddress[1] && 0 == hardwareAddress[2])) continue;
 
            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
 
            if (inetAddresses.hasMoreElements()) ipAddress = inetAddresses.nextElement().toString();
 
            break;
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }
 
    return ipAddress;
}
```
 
Danke
Uwe


----------

