16.14 Tiefer liegende Netzwerkeigenschaften
 
16.14.1 Internet Control Message Protocol (ICMP)
 
Neben dem Internet-Protokoll werden noch mehrere Steuerprotokolle auf der Vermittlungsschicht eingesetzt. Darunter befindet sich auch das Internet Control Message Protocol (ICMP), das im Prinzip ein IP-Paket mit bestimmten Flags ist. Dieses ist im RFC 792 definiert. Da das Funktionieren des Internets sehr stark von Routern abhängt, wurde ICMP entwickelt, um unerwartete Ereignisse und Zusatzinformationen zu melden. Java unterstützt zurzeit nur Sockets vom Typ SOCK_STREAM (TCP) und SOCK_DGRAM (UDP), aber keine IP-Pakete (und damit auch nicht das Internet Control Message Protocol) mit dem Sock-Typ SOCK_RAW. Daher können in Java mit den Standardbibliotheken keine IP-Pakete und ICMP-Nachrichten verschickt werden, um Rechts- und Sicherheitsproblemen vorzubeugen. Viele Unix-Systeme erlauben Sockets vom Typ SOCK_RAW auch nur unter Root-Rechten.
16.14.2 MAC-Adresse
 
Die MAC-Adresse ist eine (im Idealfall) eindeutige Adresse einer Netzwerkkarte. MAC-Adressen sind für Ethernet-Verbindungen essentiell, da auf der physikalischen Übertragungsebene Signale zu einer gewünschten Netzwerkkarte aufgebaut werden. Wegen der Eindeutigkeit eigenen sie sich gut als Schlüssel und es wäre interessant, auch in Java diese Adresse auszulesen. Das geht jedoch nicht mit Bordmitteln und nur über einen Umweg. Entweder kommt ein JNI-Teil zum Zuge, oder das Java-Programm ruft ein Kommandozeilenprogramm auf, welches die MAC-Adresse liefert. Unter Windows ist das zum Beispiel ipconfig /all. In der Liste wird dann eine Zeile wie die folgende stehen:
Physikalische Adresse . . . . . . : 00–0D-61–16–69–5F
Da von den extern gestarteten Programmen die Ausgabe angezapft werden kann, lässt sich nach der Zeile suchen und die MAC-Adresse extrahieren.
public static String getMacAddress() throws Exception
{
Process proc = Runtime.getRuntime().exec( "cmd /c ipconfig /all" );
BufferedReader br = new BufferedReader(
new InputStreamReader(proc.getInputStream()) );
Pattern p = Pattern.compile(
".*\\p{XDigit}\\p{XDigit}(-\\p{XDigit}\\p{XDigit}){5}$" );
for ( String line; (line = br.readLine()) != null; )
{
if ( p.matcher( line ).matches() )
return line.substring( line.length() – 17 );
}
return null;
}
|