#include #include /* Netwerkadresse in "dotted decimal" Schreibweise einlesen * Der Rueckgabewert 0 signalisiert das Ende der Eingabe. */ unsigned int readaddress () { unsigned int a,b,c,d, ok; ok = scanf ("%u.%u.%u.%u", &a, &b, &c, &d); if (ok != 4) { /* Ende der Eigabe */ return 0; } /* Check that all values are in the allowed range */ assert ((a <= 255) && (b <= 255) && (c <= 255) && (d <= 255)); /* Assemble Network address */ return ((a<<24) | (b<<16) | (c<<8) | d); } /* Netzmaske einlesen. Diese Funktion beruecksichtigt beider Varianten. */ unsigned int readnetmask () { unsigned int a, b, c, d, ok; char ch; /* Die Netzmaske beginnt auf jeden Fall mit einer Zahl. */ ok = scanf ("%u%c", &a, &ch); assert (ok == 2); if (ch == '\n') { /* Die Zeile endet nach der ersten Zahl, die Netzmaske * besteht also aus genau so vielen Einsen wie * durch diese Zahl angegeben. */ assert (a <= 32); return (~0 << (32 - a)); } assert (ch == '.'); /* Die Netzmaske ist in "dotted decimal" Schreibweise angegeben */ ok = scanf ("%u.%u.%u", &b, &c, &d); assert (ok == 3); assert ((a <= 255) && (b <= 255) && (c <= 255) && (d <= 255)); return ((a<<24) | (b<<16) | (c<<8) | d); } /* Netzmaske gemaess Heuristik bestimmen. */ unsigned int guessnetmask (unsigned int addr) { unsigned int mask; if (addr & (1<<31)) { /* Das hoechste Bit ist gesetzt */ if (addr & (1<<30)) { /* Hoechstes und zweithoechstes Bit gesetzt */ mask = ~0 << (32-8); } else { /* Hoechstes Bit gesetzt, zweithoechstes nicht */ mask = ~0 << (32-16); } } else { /* Das hoechste Bit ist nicht gesetzt -> 255.0.0.0 */ mask = ~0 << (32-8); } return mask; } int main () { /* Adresse und Netzmaske des Netzwerks. */ unsigned int netaddr, netmask; /* Zu testende Netzwerkadresse */ unsigned int testaddr; char c; int ok; /* Netzwerk einlesen: * 1.) Netzadresse einelesen (Funktion readaddress) * 2.) Einen Buchstaben einlesen, entweder '/' oder '\n' * 3a) Wenn ein Slash gelesen wurde, die Netzmaske einlesen * (Funktion readnetmask) * 3b) Falls kein Slash vorhanden war Netzwerkadresse * gemaess der angegebenen Heuristik bestimmen. */ printf ("Netzwerk: "); netaddr = readaddress(); ok = scanf ("%c", &c); assert (ok == 1); if (c == '/') { netmask = readnetmask (); } else { assert (c == '\n'); netmask = guessnetmask (netaddr); } /* Zuweisung! Um dem Compiler klarzumachen, dass wirklich * eine Zuweisung und kein Vergleich gemeint ist wird ein * zusaetzliches Klammernpaar verwendet. */ while ((testaddr = readaddress ())) { /* Stimmen in beiden Adressen alle Bits, die in * netmask gesetzt sind ueberein? */ if ((testaddr & netmask) == (netaddr & netmask)) { /* Ja, also gehoert die Adresse zum Netz */ printf ("ja\n"); } else { /* Nein, die Adresse gehoert nicht zum Netz */ printf ("nein\n"); } } return 0; }