Prof. Dr. Franz Schweiggert Abteilung Angewandte
Informationsverarbeitung 7. November 2001
Christian Ehrhardt Blatt 3
Allgemeine Informatik 3 (WS 2001/2002)
Abgabetermin 13.11.2001 vor den Übungen
Jeder Rechner im Internet wird durch eine sogenannte IP-Adresse
identifiziert. Eine solche Adresse besteht aus 32 Bit.
Normalerweise wird sie aber als Folge von vier Bytes getrennt
durch einen Punkt geschrieben. Zum Beispiel ist 134.60.66.5 die
Adresse der thales. Als eine 32 Bit Zahl würde dies dezimal dem
Wert 2252096005 und Hexadezimal dem Wert 0x863c4205 ergeben.
Wenn man eine ganze Klasse von Adressen (auch Netzwerk genannt)
beschreiben will, dann benötigt man zwei Angaben:
- eine Adresse aus dem Netzwerk und
- die sogenannte Netzmaske.
Eine weitere Adresse liegt genau dann in dem so beschriebenen Netzwerk,
wenn diejenigen Bits, die in der Netzmaske den Wert 1 haben
in beiden Adressen (diejenige aus der Netzwerkbeschreibung und
die, die getestet werden soll) übereinstimmen. Bits, die in
der Netzmaske den Wert 0 haben können durchaus abweichen.
Die thales gehört zu einem Netzwerk, mit der Netzmaske
255.255.255.0, d.h. die ersten 24 Bits der Netzmaske sind
gesetzt, die letzten 8 nicht. Zum selben Netzwerk gehören also
alle Rechner, deren Adresse mit 134.60.66 beginnt.
Ihr Programm soll ein Netzwerk, d.h. eine Adresse und eine
Netzmaske einlesen. Für jede weitere eingelesene Adresse soll dann
entschieden werden, ob diese Adresse zum angegebenen Netzwerk
gehört.
Die Netzmaske wird üblicherweise direkt hinter der Adresse
angegeben und von ihr durch einen Schrägstrich (/) getrennt.
Um die Netzmaske selbst anzugeben, gibt es zwei Möglichkeiten:
- Die Netzmaske kann in der selben Form wie eine Adresse angegeben
werden (vier durch Punkte getrennte Dezimalzahlen).
- In der Regel bleibt der vordere Teil der Adresse innerhalb
eines Netzes gleich, der hinter kann dagegen frei gewählt
werden. In diesen Fällen genügt es zur Abkürzung anzugeben,
wo die Grenze zwischen beiden Teilen verläuft. Dies
geschieht durch eine einzige Zahl zwischen 0 und 32, die
angibt, wieviele Bits (von vorne gezählt) in der Netzmaske
den Wert 1 haben. Die restlichen Bits haben dann den Wert 0.
Zu beachten ist, daß nicht alle Netzmasken auf dies Weise
dargestellt werden können.
Diese beiden Netze sind also identisch: 134.60.66.0/255.255.255.0
und 134.60.66.0/24.
Wenn bei einer Netzwerkbeschreibung gar keine Netzmaske angegeben
ist, soll folgende Heuristik zur Bestimmung der Netzmaske
verwendet werden:
- Wenn das höchste Bit nicht gesetzt ist (d.h. es hat den Wert 0),
dann soll die Netzmaske 255.0.0.0 sein (8 Bits gesetzt).
- Wenn das höchste Bit gesetzt ist, das zweithöchste aber nicht,
dann soll die Netzmaske 255.255.0.0 sein (16 Bits gesetzt).
- Wenn die beiden höchsten Bits gesetzt sind, dann soll die
Netzmaske 255.255.255.0 sein (24 Bits gesetzt).
Beim Einlesen der Netzwerkbeschreibung soll Ihr Programm
selbständig erkennen, ob eine Netzmaske mit angegeben wurde und
welche der beiden Formen verwendet wurde.
Zur Verdeutlichung wird die Eingabe hier noch formal in EBNF
beschrieben (n steht für ein Newline):
input |
::= |
network addresses |
network |
::= |
address ``n'' address ``/'' netmask ``n'' |
addresses |
::= |
address ``n'' address ``n'' addresses |
address |
::= |
number ``.'' number ``.'' number ``.'' number |
netmask |
::= |
address number |
number |
::= |
positive Dezimalzahl |
Hinweise: Sie können in dieser Aufgabe davon ausgehen, daß
0.0.0.0 keine gültige Adresse sein kann und auch nicht als solche
in der Eingabe auftaucht. Als Netzmaske ist 0.0.0.0 dagegen zulässig.
Für alles, was mit Netzmasken oder Adressen zu tun hat, sollten
vorzeichenlose Datentypen (am besten ``unsigned int'') verwendet
werden. Um eine solche Zahl einzulesen oder auszugeben, muß ``%u''
statt ``%d'' verwendet werden.
Christian Ehrhardt
2001-11-07