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 |