Was bedeutet InetAddress.isSiteLocalAddress() eigentlich?
Hier ist ein code zu ermitteln, der lokale host-name ist, soll die Arbeit an einem multi-homed-box:
/**
* Work out the first local host name by iterating the network interfaces
*
* @return
* @throws SocketException
*/
private String findFirstLocalHostName() throws SocketException {
Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
while (ifaces.hasMoreElements()) {
NetworkInterface iface = ifaces.nextElement();
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress add = addresses.nextElement();
if (!add.isLoopbackAddress() && add.isSiteLocalAddress()) {
return add.getHostName();
}
}
}
throw new RuntimeException("Failed to determine local hostname");
}
Wird der Anruf zu isSiteLocalAddress Einführung ein Fehler? Ich kann nicht finden alle nützliche Informationen über diese Methode, aber ich habe das Gefühl, dass es sich um IP v 6 nur und ist veraltet.
- Zur Klarstellung, ich habe nicht gemeint, dass die Methode veraltet... nur der Begriff der "site-local" - Adresse in der IPv6-pro ietf.org/rfc/rfc3879.txt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Methode ist definitiv nicht veraltet und es ist definitiv nicht nur in IPv6.
In IPv4 gibt es 3 Netzwerk-Adressbereiche definiert sind, die für die site-local-Adressen: 10/8, 172.16/12 und 192.168/16.
Lesen
Inet4Address.isSiteLocalAddress()
zeigt, dass Adressen aus genau diesen 3 Netzwerken zurücktrue
auf diese Methoden.IPv6 hat ein ähnliches Konzept, hier diese Adressen werden genannt unqieu lokale Adressen.
Effektiv das erfahren Sie, wenn Sie die Adresse haben, ist definitiv nicht eine öffentliche (beachten Sie, dass, auch wenn diese Methode gibt
false
, die Adresse möglicherweise noch nicht öffentlich).Blick auf die Umsetzung...
Für eine
Inet4Address
es überprüft, um zu sehen, ob es einen der RFC1918 "unrouteable" Adressen: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.Für eine
Inet6Address
wird, überprüft es die ersten zwei Oktette, um zu sehen, ob es ein echtes "site local" - Adresse.'Site-local' ist ein veralteter name für die privaten IP-Adressraum. (Einige Nuancen, aber grundsätzlich richtig.) Finden Sie in RFC 1918.
Ich kam gerade über Sie, was ich glaube, ist ein ähnliches problem: versucht zu bestimmen, was IPv6 sollte ich verwenden für LAN comuncation:
IMHO
Inet6Address.isSiteLocalAddress()
ist nutzlos. Da die0xFEC0
Präfix wurde depricated von RFC 3879 wie @tigz erwähnt. Ich habe noch zu sehen, jedes Gerät (android, win, osx) haben tatsächlich eine0xFEC0
(mit eingeschränkten Test)//from java.net.Inet6Address (1.8.0_45)
boolean isSiteLocalAddress() {
return ((ipaddress[0] & 0xff) == 0xfe
&& (ipaddress[1] & 0xc0) == 0xc0);
}
0xFE80
- Adresse, obwohl die eigentlich nicht verwendet werden für den Verkehr (von meinem Verständnis und Lesen (http://www.cisco.com)) hat Arbeit für die LAN-Kommunikation mit meinem einzigen router (ping6, curl, http).Mein Global Unicast (das ist nur ein anderer name für die öffentliche IP)
2601::/20
von Comcast arbeitete für meine LAN-Kommunikation. Also ich würde sagen, dass dies die richtige Adresse zu verwenden.Präfix-Tabelle: http://www.iana.org
Soweit ich weiß die isSiteLocalAddress Methode ist nicht veraltet.
isSiteLocalAddress - Erklärung
die angibt, ob das InetAddress-ist eine site-local-Adresse; oder false, wenn die Adresse nicht eine site-local unicast-Adresse.
Den InetAddress haben sogar zwei direkte Unterklassen;
Inet4Address und
Inet6Address
Die beste Wette ist, um Lesen Sie den JavaDocs.
Welche version des JDK benutzt du?