По количеству подсетей, заданному классу и количеству компьютеров определить маску и список 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д