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.0

    Nun 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.255
    

    Manchmal 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! 😉


Anmelden zum Antworten