Subnetting berechnung mit C++
-
Hallo,
hab folgendes Problem ich brauche einen Algorithmus mit dem ich die erste, letzte Ip ausrechnen lassen kann eines Subnetztes und die NET-ID.
Mein problem ist nicht das verständnis beim Programmieren sondern das ich diesen Subnetting einfach net verstehe will einfach nicht in meine Birne...
-
Du hast die Subnetz-Maske und die IP-Adresse, damit dürfte der Rest sich auf einfache Binär-Arithmetik beschränken:
IP adresse = "..."; IP subnetz = "255.255.255.0";// oder war's anders herum? hier steht '1' für Netz-Anteil und '0' für die Adresse im Subnetz IP lowest = adresse & subnetz; IP highest = adresse | ~subnetz;
-
#include <iostream> #define MAKE_ADDRESS( a, b, c, d ) \ ( ( ( a ) << 24 ) | ( ( b ) << 16 ) | ( ( c ) << 8 ) | ( d ) ) inline void print_ip( unsigned long ip ) { std::cout << ( ( ip >> 24 ) & 0xff ) << "." << ( ( ip >> 16 ) & 0xff ) << "." << ( ( ip >> 8 ) & 0xff ) << "." << ( ip & 0xff ) << " "; } inline int count_bits( unsigned long v ) { int result = ( ( ( ( v & 0xfff ) * 0x1001001001001ULL & 0x84210842108421ULL ) % 0x1f ) + ( ( ( ( v & 0xfff000 ) >> 12 ) * 0x1001001001001ULL & 0x84210842108421ULL ) % 0x1f ) + ( ( ( v >> 24 ) * 0x1001001001001ULL & 0x84210842108421ULL ) % 0x1f ) ); return result; } int main() { unsigned long id = MAKE_ADDRESS( 192, 168, 178, 0 ); unsigned long org_mask = MAKE_ADDRESS( 255, 255, 255, 0 ); unsigned long mask = MAKE_ADDRESS( 255, 255, 255, 224 ); if ( org_mask > mask ) { std::cout << "Fehlerhafte Netzmaske" << std::endl; return 0; } // Count of Subnets unsigned long count = ( 1 << count_bits( org_mask ^ mask ) ); unsigned long host_bits = count_bits( ~mask ); for ( int i = 0; i < count; ++i ) { unsigned long netid = ( id & mask ) | ( i << host_bits ); unsigned long bcast = ( id | ~mask ) | ( i << host_bits ); print_ip( netid ); // Netz-ID print_ip( netid+1 ); // Erster Host print_ip( bcast-1 ); // Letzter Host print_ip( bcast ); // Broadcast std::cout << std::endl; } }Wenns um den Hostteil geht muss noch eins addiert bzw subtrahiert werden. Da 192.168.178.0 die Netz-ID darstellt und 192.168.178.255 der Broadcast ist und somit nicht an Hosts vergeben werden kann.

Nochmal Subnetting in Kurzforum:
Du hast eine Netz-ID: 192.168.178.0
Eine Netzmaske: 255.255.255.0Nun willst du das Ganze in Subnetzte unterteilen, d.h. du nimmst einige Bits deines Hostteils weg um eine neue Subnetzmaske zu erstellen. Zum Beispiel die ersten 3 Bits des letzten Oktets.
11111111 11111111 11111111 11100000 => 255.255.255.224
Jetzt hast du 3 Bits für deine Subnetzte und 5 Bits für deine Hosts innerhalb der einzelnen Netzte.
Netz-ID Erster Host Letzter Host BCast 192.168.178.0 192.168.178.1 192.168.178.30 192.168.178.31 192.168.178.32 192.168.178.33 192.168.178.62 192.168.178.63 192.168.178.64 192.168.178.65 192.168.178.94 192.168.178.95 192.168.178.96 192.168.178.97 192.168.178.126 192.168.178.127 192.168.178.128 192.168.178.129 192.168.178.158 192.168.178.159 192.168.178.160 192.168.178.161 192.168.178.190 192.168.178.191 192.168.178.192 192.168.178.193 192.168.178.222 192.168.178.223 192.168.178.224 192.168.178.225 192.168.178.254 192.168.178.255Manchmal werden die Netzte mit der Bitstruktur 000 und 111 nicht vergeben. Können aber theoretisch. Hoffe das die Liste stimmt. Is ausm Kopf und Subnetting ist lang her!

P.s.: Ich hoffe der grauenhafte Code funktioniert einigermaßen. Habs nich hinreichend getestet!
