Code:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
/******************************************************
DECLARE VARIABLES
*******************************************************/
int oct1, oct2, oct3, oct4, cidr;
int noct1=0, noct2=0, noct3=0, noct4=0;
int boct1=255, boct2=255, boct3=255, boct4=255;
int mask1=0, mask2=0, mask3=0, mask4=0;
int netbits=0,bitsbor, maskSum, hostbits, netinc, cond, ans, hosts, nets, i;
char classtype;
/******************************************************
START MAIN PROGRAM
*******************************************************/
int main (void) {
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define BROWN 6
#define LIGHTGREY 7
#define DARKGREY 8
#define LIGHTBLUE 9
#define LIGHTGREEN 10
#define LIGHTCYAN 11
#define LIGHTRED 12
#define LIGHTMAGENTA 13
#define YELLOW 14
#define WHITE 15
#define BLINK 128
/******************************************************
GET USER INPUT
*******************************************************/
do{
system ("cls");
system ("title Subnet Calculator");
system ("mode con cols=65 lines=40");
SetConsoleTextAttribute(hConsole, 11);
printf ("Enter your IP address and subnet mask using CIDR notation:\n\n");
SetConsoleTextAttribute(hConsole, 10);
printf (">>> ");
SetConsoleTextAttribute(hConsole, 14);
printf (" ");
scanf ("%d %*c %d %*c %d %*c %d %*c %d", &oct1, &oct2, &oct3, &oct4, &cidr);
if (oct1>223 || oct2>255 || oct3>255 || oct4>255 || cidr<8 || cidr>30){
system ("cls");
SetConsoleTextAttribute(hConsole, 12);
printf ("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\n\n\n You have entered an invalid IP address or CIDR.\n\n\n ***PROGRAM WILL SELF DESTRUCT***\n\n\n");
system ("pause");
exit (0);
}
/******************************************************
DETERMINE CLASS TYPE
*******************************************************/
if (oct1>=1 && oct1<=127){
classtype = 'A';
netbits = 8;
}
else if (oct1>=128 && oct1<=191){
classtype = 'B';
netbits - 16;
}
else if (oct1>=192 && oct1<=223){
classtype = 'C';
netbits = 24;
}
/******************************************************
DETERMINE BIT VALUE
*******************************************************/
bitsbor = cidr-netbits;
if (bitsbor>16 && bitsbor<24){
cond=bitsbor-16;
}
else if (bitsbor>8 && bitsbor<16){
cond=bitsbor-8;
}
else {
cond=bitsbor;
}
switch (cond) {
case 1:
netinc = 128;
maskSum = 128;
break;
case 2:
netinc = 64;
maskSum = 192;
break;
case 3:
netinc = 32;
maskSum = 224;
break;
case 4:
netinc = 16;
maskSum = 240;
break;
case 5:
netinc = 8;
maskSum = 248;
break;
case 6:
netinc = 4;
maskSum = 252;
break;
case 7:
netinc = 2;
maskSum = 254;
break;
case 8:
netinc = 1;
maskSum = 255;
break;
}
/******************************************************
DETERMINE SUBNET MASK, NETWORK ID, AND BROADCAST ID
*******************************************************/
if (cidr>=24 && cidr<=30){
mask1=255;
mask2=255;
mask3=255;
mask4=maskSum;
boct1=oct1;
boct2=oct2;
boct3=oct3;
noct1=oct1;
noct2=oct2;
noct3=oct3;
for (i=256; i>=oct4; i-=netinc){
}
noct4=i;
boct4=noct4+netinc-1;
}
if (cidr>=16 && cidr <=23){
mask1=255;
mask2=255;
mask3=maskSum;
boct1=oct1;
boct2=oct2;
noct1=oct1;
noct2=oct2;
for (i=256; i>=oct3; i-=netinc){
}
noct3=i;
boct3=noct3+netinc-1;
}
if (cidr>=8 && cidr<=15){
mask1=255;
mask2=maskSum;
boct1=oct1;
noct1=oct1;
for (i=256; i>=oct2; i-=netinc){
}
noct2=i;
boct2=noct2+netinc-1;
}
/******************************************************
DETERMINE NUMBER OF AVAILABLE HOSTS & NETWORKS
*******************************************************/
hostbits=32-cidr;
hosts=pow (2, hostbits)-2;
nets=pow(2, bitsbor);
/******************************************************
DISPLAY RESULTS
*******************************************************/
printf ("\n\n\n");
SetConsoleTextAttribute(hConsole, 10);
printf ("You entered ............................... ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d.%d.%d.%d /%d\n", oct1, oct2, oct3, oct4, cidr);
SetConsoleTextAttribute(hConsole, 10);
printf ("Subnet Mask ............................... ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d.%d.%d.%d\n\n\n", mask1, mask2, mask3, mask4);
SetConsoleTextAttribute(hConsole, 10);
printf ("Class ..................................... ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%c\n\n", classtype);
SetConsoleTextAttribute(hConsole, 10);
printf ("Network ID ................................ ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d.%d.%d.%d\n", noct1, noct2, noct3, noct4);
SetConsoleTextAttribute(hConsole, 10);
printf ("First assignable Address .................. ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d.%d.%d.%d\n", noct1, noct2, noct3, noct4+1);
SetConsoleTextAttribute(hConsole, 10);
printf ("Last assignable Address ................... ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d.%d.%d.%d\n", boct1, boct2, boct3, boct4-1);
SetConsoleTextAttribute(hConsole, 10);
printf ("Broadcast ID .............................. ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d.%d.%d.%d\n\n", boct1, boct2, boct3, boct4);
SetConsoleTextAttribute(hConsole, 10);
printf ("Borrowed bits ............................. ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d\n", bitsbor);
SetConsoleTextAttribute(hConsole, 10);
printf ("Subnet increments ......................... ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d\n", netinc);
SetConsoleTextAttribute(hConsole, 10);
printf ("Available subnets ......................... ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d\n", nets);
SetConsoleTextAttribute(hConsole, 10);
printf ("Available hosts per subnet ................ ");
SetConsoleTextAttribute(hConsole, 13);
printf ("%d\n\n\n", hosts);
SetConsoleTextAttribute(hConsole, 11);
printf ("Would you like to enter another IP address?\n\nEnter 1 to continue\nEnter 0 to exit\n\n");
SetConsoleTextAttribute(hConsole, 10);
printf (">>> ");
SetConsoleTextAttribute(hConsole, 14);
scanf ("%d", &ans);
} while (ans==1);
SetConsoleTextAttribute(hConsole, 10);
printf ("\n\n\n\n");
return 0;
} //END MAIN PROGRAM