Datei: ipaddr.c


    1   /*
    2    *      ipaddr.c
    3    *      Anzahl Subnetzbits einlesen,
    4    *      daraus Netzmaske und Broadcast bilden,
    5    *      dann IP-Adressen einlesen und pruefen
    6    *      klin, Thu Nov 24 19:51:52 1999
    7    */
    8   
    9   #include <stdio.h>
   10   
   11   /* Typ fuer 32-Bit IP-Addresse  */
   12   #define IPADDR unsigned long
   13   
   14   /* 32-Bit Maske fuer das untere Byte    */
   15   #define IPMASK 0x000000ff
   16   
   17   /* Ausgabeflag dezimal, sedezimal, oktal, binaer */
   18   #define PUTDEC  0
   19   #define PUTHEX  1
   20   #define PUTOCT  2
   21   #define PUTBIN  3
   22   
   23   /* Prototypen */
   24   IPADDR get_ipaddr(void);
   25   void put_ipaddr(IPADDR, int);
   26   void put_bits(unsigned char);
   27   
   28   void main(void)
   29   {
   30     IPADDR mask;  /* Netzmaske            */
   31     IPADDR cast;  /* Broadcast-Adresse    */
   32     IPADDR subn;  /* Subnetzadresse       */
   33     IPADDR ia;    /* Allg. IP-Adresse     */
   34     int nbits;    /* Bits des Subnets     */
   35   
   36     /* Subnet-Bits lesen und Netzmaske bilden */
   37     printf("Subnet-Bits eingeben: ");
   38     scanf("%d", &nbits);
   39     mask = ~0 << nbits;
   40   
   41     /* IP-Adresse lesen und Broadcast bilden */
   42     printf("IP-Adresse eingeben:  ");
   43     cast = get_ipaddr() | ~mask;
   44   
   45     /* Subnetzaddresse ermitteln */
   46     subn = mask & cast;
   47     
   48     /* Konfiguration anzeigen */
   49     printf("\nKonfiguration\n=============\n");
   50     printf("\nNetzmaske: ");
   51     put_ipaddr(mask, PUTDEC);
   52     printf("\nBroadcast: ");
   53     put_ipaddr(cast, PUTDEC);
   54     printf("\nSubnetz:   ");
   55     put_ipaddr(subn, PUTDEC);
   56     printf("\n\n");
   57   
   58     /* IP-Addressen lesen und pruefen */
   59     do {
   60       printf("IP-Addresse eingeben: ");
   61       ia = get_ipaddr();
   62       put_ipaddr(ia, PUTDEC);
   63       printf(" - ");
   64       if ((ia & mask) == subn) {
   65         printf("im Subnetz ");
   66         put_ipaddr(subn, PUTDEC);
   67       }
   68       else {
   69         printf("nicht im Subnetz ");
   70         put_ipaddr(subn, PUTDEC);
   71       }
   72       printf("\n");
   73     } while (ia != 0);
   74   
   75   } /* main() */
   76   
   77   /* IP-Adresse xxx.xxx.xxx.xxx einlesen */
   78   IPADDR get_ipaddr(void)
   79   {
   80     IPADDR ra;
   81     unsigned int d1, d2, d3, d4;
   82   
   83     /* IP-Addresse in Dezimalform einlesen */
   84     scanf("%d.%d.%d.%d", &d4, &d3, &d2, &d1);
   85   
   86     /* IP-Adresse in Variable kopieren ... */
   87     ra = 0;
   88     ra = d4 << 24 | d3 << 16 | d2 << 8 | d1;
   89     /* ... und zurueckgeben */
   90   
   91     return(ra);
   92   
   93   } /* get_ipaddr() */
   94   
   95   /* IP-Adresse als xxx.xxx.xxx.xxx ausgeben */
   96   void put_ipaddr(IPADDR a, int flag)
   97   {
   98     int d4, d3, d2, d1;
   99   
  100     /* IP-Adresse in 4 Bytes aufbrechen ... */
  101     d4 = a >> 24 & IPMASK;
  102     d3 = a >> 16 & IPMASK;
  103     d2 = a >>  8 & IPMASK;
  104     d1 = a       & IPMASK;
  105   
  106     /* ... und ausgeben */
  107     switch (flag) {
  108       case PUTHEX:        /* sedezimal */
  109         printf("%02X.%02X.%02X.%02X", d4, d3, d2, d1);
  110         break;
  111       case PUTOCT:        /* oktal */
  112         printf("%02o.%02o.%02o.%02o", d4, d3, d2, d1);
  113         break;
  114       case PUTBIN:        /* binaer */
  115         put_bits(d4);
  116         putchar('.');
  117         put_bits(d3);
  118         putchar('.');
  119         put_bits(d2);
  120         putchar('.');
  121         put_bits(d1);
  122         break;
  123       default:            /* dezimal */
  124         printf("%d.%d.%d.%d", d4, d3, d2, d1);
  125         break;
  126     }
  127   
  128   } /* put_ipaddr() */
  129   
  130   /* Byte bitweise ausgeben */
  131   void put_bits(unsigned char c)
  132   {
  133     unsigned char m;      /* Maske   */
  134   
  135     /* Maske und Zaehler initialisieren */
  136     m = 1 << 7;
  137     /* Schleife ueber alle Bitpositionen */
  138     while (m > 0) {
  139       /* 1, wenn Bit gesetzt, sonst 0 */
  140       putchar(c & m ? '1' : '0');
  141       /* Maske verschieben */
  142       m >>= 1;
  143     }
  144   
  145   } /* put_bits() */


Erzeugt von c2html 1.01