NetCalc Subnet CalculatorI wrote a little python script some months ago for school, as I was to lazy to calculate all that stuff by myself again and again...
It calculates the most important stuff like
- netmask/cidr
- maschine part (= inversed netmask)
- max-number of possible hosts
- broadcast addresse
- default gateway
Usage:
Compile and execute as usual, enter an IP, then enter a netmask, if you don't enter anything as netmask then the program will ask you for the CIDR instead.
Source Code:
/*
* Author: flowjob [from EvilZone.org]
* Version: 0.2
* Description:
* C++ port of a python script
* I wrote for an IT class, that
* calculates all the values I needed
* based on the IP and a CIDR/Subnet.
*/
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
using namespace std;
struct addr_t {
string notation;
unsigned int value;
};
int calcIPValue( string ipaddr ) {
/* Calculates the binary value
* of the IP Adresse */
string buf;
int values[4];
unsigned int binary = 0;
int i = 0;
ipaddr += '.';
for ( char c : ipaddr ) {
if ( c != '.' ) {
buf += c;
}
else {
stringstream(buf) >> values[i];
buf = "";
i++;
}
}
i = 0;
for ( int value : values ) {
binary |= value << ( 8*(3-i) );
i++;
}
return binary;
}
string calcIPNotation( unsigned int binary ) {
/* Calculates the IP-Notation
* given its value */
string notation;
for (int i = 0; i < 4; i++) {
int shift = 255 << ( 8*(3-i) );
unsigned int part = binary & shift;
part >>= 8*(3-i);
ostringstream value;
if ( i != 0 ) {
value << '.';
}
value << part;
notation += value.str();
}
return notation;
}
addr_t calcSubnet( int cidr ) {
/* Calculate the binary value
* given the CIDR */
addr_t subnet;
subnet.value = 4294967295 << ( 32-cidr );
subnet.notation = calcIPNotation(subnet.value);
// 4294967295 sets all bits to 1, int should be 4 bytes!
return subnet;
}
int calcCIDR( addr_t subnet ) {
/* Calculate the CIDR given
* the binary value of the SUbnet */
int cidr = 0;
while ( subnet.value != 0 ) {
subnet.value = subnet.value << 1;
cidr += 1;
}
return cidr;
}
addr_t calcNetPart( addr_t *ipaddr, addr_t *subnet ) {
/* Calculates the network-part
* of the IP Addresse */
addr_t netpart;
netpart.value = ipaddr->value & subnet->value;
netpart.notation = calcIPNotation(netpart.value);
return netpart;
}
addr_t calcMacPart( addr_t *subnet ) {
/* Calculates the machine-part
* of the IP Addresse */
addr_t macpart;
macpart.value = ~subnet->value;
macpart.notation = calcIPNotation(macpart.value);
return macpart;
}
addr_t calcBroadCast( addr_t *netpart, addr_t *macpart ) {
/* Calculates the Broadcast
* Addresse of the network */
addr_t broadcast;
broadcast.value = netpart->value | macpart->value;
broadcast.notation = calcIPNotation(broadcast.value);
return broadcast;
}
addr_t calcDefaultGW( addr_t *netpart ) {
/* Calculates the Default-Gateway
* of the network */
addr_t defaultgw;
defaultgw.value = netpart->value + 1;
defaultgw.notation = calcIPNotation(defaultgw.value);
return defaultgw;
}
int calcHostNum( addr_t *macpart ) {
/* Calculates the number of
* available Addresses */
unsigned int hostnum = macpart->value + 1;
return hostnum;
}
int main( int argc, char **argv ) {
cout << "Enter an IP-Address and a Netmask/CIDR..." << endl;
addr_t ipaddr;
addr_t subnet;
int cidr;
addr_t macpart;
int hostnum;
addr_t netpart;
addr_t broadcast;
addr_t defaultgw;
cout << "IP-Address? ";
getline(cin,ipaddr.notation);
ipaddr.value = calcIPValue(ipaddr.notation);
cout << "Netmask? ";
getline(cin,subnet.notation);
if ( subnet.notation == "" ) {
cout << "CIDR? ";
cin >> cidr;
subnet = calcSubnet(cidr);
subnet.notation = calcIPNotation(subnet.value);
}
else {
subnet.value = calcIPValue(subnet.notation);
cidr = calcCIDR(subnet);
}
macpart = calcMacPart(&subnet);
hostnum = calcHostNum(&macpart);
netpart = calcNetPart(&ipaddr, &subnet);
broadcast = calcBroadCast(&netpart , &macpart);
defaultgw = calcDefaultGW(&netpart);
cout << "=================================" << endl;
cout << "IPv4: " << ipaddr.notation << endl;
cout << "Netmask: " << subnet.notation << endl;
cout << "CIDR: " << cidr << endl;
cout << "Inversed Netmask: " << macpart.notation << endl;
cout << "Hosts: " << hostnum << endl;
cout << "Network: " << netpart.notation << endl;
cout << "Broadcast: " << broadcast.notation << endl;
cout << "Default-Gateway: " << defaultgw.notation << endl;
cout << "=================================" << endl;
return EXIT_SUCCESS;
}
That script was the first thing I wrote in C++ except "Hello, World" so it isn't that advanced.
The original python script is here
>> netcalc.py