По количеству подсетей, заданному классу и количеству компьютеров определить маску и список IP - C (СИ)
Формулировка задачи:
Здравствуйте, необходимо разработать приложение на С/С++, которое по заданному классу (А, В или С), количеству подсетей N и максимальному количеству компьютеров M в подсети определяет маску для разбиения на
подсети и список возможных IP-адресов подсетей. Если разбиение на подсети невозможно,
приложение должно выдавать соответствующее сообщение об ошибке.
Решение задачи: «По количеству подсетей, заданному классу и количеству компьютеров определить маску и список IP»
textual
Листинг программы
/*необходимо разработать приложение на С/С++, которое по заданному классу (А, В или С),
количеству подсетей N и максимальному количеству компьютеров M в подсети определяет маску для разбиения на
подсети и список возможных IP-адресов подсетей. Если разбиение на подсети невозможно,
приложение должно выдавать соответствующее сообщение об ошибке.*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct _TAddress
{ char IPclass;
int a[4];
int freeBits;
int Nbits;
int Mbits;
} TAddress;
void FillPow2 (int pow2[])
{ int i = 0;
pow2[0] = 1;
while (++i<25)
pow2[i] = pow2[i-1]*2;
}
int IsClass (char c)
{ char *alphabet = "ABC";
int i = strlen(alphabet);
while (--i >-1)
if (c == alphabet[i])
return 1;
return 0;
}
TAddress *CreateAddress (char cl)
{ TAddress *address = (TAddress*) malloc (sizeof(TAddress));
address->IPclass = cl;
address->a[0] = 255;
address->a[1] = address->a[2] = address->a[3] = 0;
if (cl == 'A')
address->freeBits = 24;
else
{ address->a[1] = 255;
if (cl == 'B')
address->freeBits = 16;
else
{ address->a[2] = 255;
address->freeBits = 8;
}
}
address->Mbits = address->Nbits = -1;
return address;
}
void DeleteAddress (TAddress *address)
{ free (address);
}
void PrintAddress (TAddress *address)
{ for (int i = 0; i<4; i++)
printf("%3d.", address->a[i]);
printf("\n");
}
void FillBits (TAddress *address, int N, int M, int pow2[])
{ int i;
if (N)
{ for (i = 0; i<25; i++)
if (N <= pow2[i]-2)
{ address->Nbits = i;
break;
}
for (i = 0; i<25; i++)
if (M <= pow2[i]-2)
{ address->Mbits = i;
break;
}
}
else
{ address->Nbits = 0;
address->Mbits = address->freeBits;
}
}
int CheckBits (TAddress *address)
{ return address->Nbits + address->Mbits <= address->freeBits && address->Nbits>=0 && address->Mbits>0;
}
int ai (int pow2[], int bits)
{ int i = 0, sum = pow2[7];
while (++i < bits)
sum += pow2[7-i];
return sum;
}
void CreateMask (TAddress *address, int pow2[])
{ if (!address->Nbits)
return;
if (address->IPclass == 'C')
{ address->a[3] = ai(pow2, address->Nbits);
return;
}
if (address->IPclass == 'B')
{ if (address->Nbits <= 8)
{ address->a[2] = ai(pow2, address->Nbits);
return;
}
else
{ address->a[2] = 255;
address->a[3] = ai(pow2, address->Nbits-8);
return;
}
}
if (address->Nbits <= 8)
{ address->a[1] = ai(pow2, address->Nbits);
return;
}
else if (address->Nbits <= 16)
{ address->a[1] = 255;
address->a[2] = ai(pow2, address->Nbits-8);
return;
}
else
{ address->a[1] = address->a[2] = 255;
address->a[3] = ai(pow2, address->Nbits-16);
return;
}
}
int main()
{ int pow2[25], N, M;
FillPow2 (pow2);
char cl;
do
{ printf("Network class:\t");
cl = toupper (getc(stdin));
getc(stdin);
} while (!IsClass (cl));
TAddress *address = CreateAddress (cl);
printf("Class standard mask:\t");
PrintAddress (address);
printf("\n\nNumber of subnetworks N = ");
scanf ("%d", &N);
printf("Maximum number of computers in one subnetwork M = ");
scanf ("%d", &M);
getc(stdin);
FillBits (address, N, M, pow2);
printf("Free bits: %d\tBits for subs: %d\tBits for comps: %d", address->freeBits, address->Nbits, address->Mbits);
if (CheckBits (address))
{ CreateMask (address, pow2);
printf("\n\nThis configuration mask:\t");
PrintAddress (address);
}
else
printf("\n\nImpossible to create this configuration\n");
DeleteAddress (address);
getchar();
return 0;
}
Объяснение кода листинга программы
- Объявление переменных:
- pow2 - массив для хранения степеней двойки, инициализируется значением 1 в степени от 0 до 25;
- N, M - переменные для хранения количества подсетей и максимального количества компьютеров в подсети соответственно;
- cl - переменная для хранения класса сети (A, B или C);
- address - указатель на структуру TAddress, которая содержит информацию об адресе сети;
- ai - функция для вычисления суммы степеней двойки от 0 до указанного числа бит;
- FillBits - функция для заполнения переменных Nbits и Mbits в структуре TAddress, которые содержат количество бит для подсетей и компьютеров соответственно;
- CheckBits - функция для проверки возможности создания маски для заданных параметров;
- CreateMask - функция для создания маски для заданных параметров;
- PrintAddress - функция для вывода информации об адресе сети в консоль.
- Основной цикл программы:
- Пользователю предлагается ввести класс сети;
- Создается структура TAddress с заданным классом сети;
- Выводится стандартная маска для заданного класса сети;
- Пользователю предлагается ввести количество подсетей и максимальное количество компьютеров в подсети;
- Заполняются переменные Nbits и Mbits в структуре TAddress;
- Выводится информация о количестве свободных бит, бит для подсетей и бит для компьютеров;
- Проверяется возможность создания маски для заданных параметров;
- Если возможно, создается маска и выводится на экран;
- Если невозможно, выводится сообщение об ошибке;
- Освобождается память, выделенная под структуру TAddress.
- Варианты масок для каждого класса сети:
- Для класса C: первая октетная сетка (255.255.255.0);
- Для класса B: первая и вторая октетные сетки (255.255.0.0);
- Для класса A: первая, вторая и третья октетные сетки (255.255.255.255).