ПЗ | Арк.
19
Зм. | Арк. | № докум | Підпис | Дата
__fastcall P2::P2(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall P2::Execute()
{ n:
//викликаємо функцію randomize для випадкового вибору маршруту
randomize();
//викликаємо функцію яка визначає завантаженість маршрутизатора, для наглядного //відображення завантаженості
Run2();
//організовуємо цикл який керує роботою процесу, виконується до тих пір поки //користувач не призупинить роботу потоку.
while(!Form1->CheckBox1->Checked)
{
//вибираємо лінію для відправки
r=random(4);
//якщо маршрутизатор не занятий, вказуємо на завантаження пакету, інакше //очікуємо
if(r==1)
{
x:
if(Form1->Label4->Caption==1)
{
Sleep(100);
if(Form1->Label7->Caption==1){goto v;}
else{goto x;}
}
КР.КС-94.00.00.000 ПЗ | Арк.
20
Зм. | Арк. | № докум | Підпис | Дата
else
{
Form1->Label4->Caption=1; Form1->Label13->Caption=owner;
}
}
//if(r==2){Form1->Label7->Caption=1; Form1->Label16->Caption=owner; }
if(r==3)
{
x1:
if(Form1->Label10->Caption==1)
{
Sleep(100);
if(Form1->Label7->Caption==1){goto v;}
else{goto x1;}
}
else
{
Form1->Label10->Caption=1;Form1->Label19->Caption=owner;
}
}
//обробляємо буфер на локальному маршрутизаторі
v: if(Form1->Label7->Caption==1)
{ run2();
if(Form1->Label8->Caption==1)
{
run2();
if(Form1->Label9->Caption==1)
{ run2();
КР.КС-94.00.00.000 ПЗ | Арк.
21
Зм. | Арк. | № докум | Підпис | Дата
Sleep(1000);Form1->Label9->Caption=0;/*robumo*/ run2();
Sleep(1000);Form1->Label8->Caption=0; run2();
Sleep(1000);Form1->Label7->Caption=0; run2();
}
else{run2();Form1->Label7->Caption=0;Form1->Label9->Caption=1;}
}
else{run2();Form1->Label8->Caption=1;Form1->Label7->Caption=0;}//robumo peremi4ennje
}
}
//реалізовуємо керування потоком
while(Form1->CheckBox1->Checked)
{Sleep(100);}
goto n;
//---- Place thread code here ----
}
//визначаємо завантаженість маршрутизатора
run2()
{int k=0;
if(Form1->Label7->Caption==1){k++;}
if(Form1->Label8->Caption==1){k++;}
if(Form1->Label9->Caption==1){k++;}
Form1->ProgressBar2->Position=k;//Sleep(300);
}
Код маршрутизатора 3.
//підключаємо бібліотеки потрібні для роботи третього потоку
#include <vcl.h>
#pragma hdrstop
//підключаємо h – файли інших процесів
КР.КС-94.00.00.000 ПЗ | Арк.
22
Зм. | Арк. | № докум | Підпис | Дата
#include "Unit1.h"
#include "Unit4.h"
#pragma package(smart_init)
//оголошуємо змінні та прототипи функцій для роботи потоку
int owner=3,r;
int run3();
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
Synchronize(UpdateCaption);
where UpdateCaption could look like:
void __fastcall P3::UpdateCaption()
{
Form1->Caption = "Updated in a thread";
}
__fastcall P3::P3(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall P3::Execute()
{ n:
//викликаємо функцію randomize для випадкового вибору маршруту
randomize();
//організовуємо цикл який керує роботою процесу, виконується до тих пір поки //користувач не призупинить роботу потоку.
while(!Form1->CheckBox1->Checked)
{
//викликаємо функцію яка визначає завантаженість маршрутизатора, для наглядного //відображення завантаженості
КР.КС-94.00.00.000 ПЗ | Арк.
23
Зм. | Арк. | № докум | Підпис | Дата
Run3();
//вибираємо лінію для відправки
r=random(3);
//якщо маршрутизатор не занятий, вказуємо на завантаження пакету, інакше //очікуємо
if(r==1)
{
x:
if(Form1->Label4->Caption==1)
{
Sleep(100);
if(Form1->Label10->Caption==1){goto v;}
else{goto x;}
}
else
{
Form1->Label4->Caption=1; Form1->Label13->Caption=owner;
}
}
if(r==2)
{
x1:
if(Form1->Label7->Caption==1)
{
Sleep(100);if(Form1->Label10->Caption==1){goto v;}
else{goto x1;}
}
else
КР.КС-94.00.00.000 ПЗ | Арк.
24
Зм. | Арк. | № докум | Підпис | Дата
{
Form1->Label7->Caption=1; Form1->Label16->Caption=owner;
}
}
//if(r==3){Form1->Label10->Caption=1;Form1->Label19->Caption=owner; }
//обробляємо буфер на локальному маршрутизаторі
v: if(Form1->Label10->Caption==1)
{if(Form1->Label11->Caption==1)
{if(Form1->Label12->Caption==1)
{ run3();
Sleep(1000);Form1->Label12->Caption=0;/*robumo*/ run3();
Sleep(1000);Form1->Label11->Caption=0; run3();
Sleep(1000);Form1->Label10->Caption=0; run3();
}
else{run3();Form1->Label11->Caption=0;Form1->Label12->Caption=1;}
}
else{run3();Form1->Label11->Caption=1;Form1->Label10->Caption=0;}//robumo peremi4ennje
}
}
//реалізовуємо керування потоком
while(Form1->CheckBox1->Checked)
{Sleep(100);}
goto n;
//---- Place thread code here ----
}
//визначаємо завантаженість маршрутизатора
run3()
{int k=0;
КР.КС-94.00.00.000 ПЗ | Арк.
25
Зм. | Арк. | № докум | Підпис | Дата
if(Form1->Label10->Caption==1){k++;}
if(Form1->Label11->Caption==1){k++;}
if(Form1->Label12->Caption==1){k++;}
Form1->ProgressBar3->Position=k;//Sleep(300);
}
Завдання 20. Напишіть функцію, що здійснює пересилку в IP-маршрутизаторі. У процедури повинен бути один параметр - IP-адреса. Є доступ до глобальної
таблиці, що є масивом з трійок значень. Кожна трійка
містить наступні цілочисельні значення: IP-адресу, маску підмережі і вихідну лінію. Функція шукає IP-адресу в таблиці, використовуючи CIDR, і повертає номер вихідної лінії.
Програма на мові С.
// підключення бібліотек
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
//бібліотека для вводу/виводу
#include <stdlib.h>
//бібліотека для роботи з текстом
#include <conio.h>
//бібліотека для виводу на екран
#include <math.h>
//бібліотека математичних функцій
#pragma argsused
//оголошуємо змінні
int p1,p2,p3,p4,i1,pokazchik;
int rez11,rez12,rez13,rez14,rez21,rez22,rez23,rez24,rez31,rez32,rez33,rez34;
КР.КС-94.00.00.000 ПЗ | Арк.
26
Зм. | Арк. | № докум | Підпис | Дата
char ipadress[16],ippart1[4],ippart2[4],ippart3[4],ippart4[4],box='1';
int foripparts(void);
//оголошення прототипу функції для переводу тексту в числа типу INT
int main(int argc, char* argv[])
{
//оголошуємо масив із значеннями IP адресів в таблиці маршрутизації
int masip[5][4]={{193,23,12,1},
{168,17,45,85},
{191,21,25,5},
{195,24,5,155},
{190,27,55,25}},
//оголошуємо масив із значеннями масок підмереж в таблиці маршрутизації
masmask[5][4]={{255,252,0,0},
{255,255,255,0},
{255,255,252,0},
{255,255,255,252},
{255,255,248,0}},
//оголошуємо масив із значеннями ліній які відповідають записам в таблиці //маршрутизації
masline[]={5,4,3,2,1};
//організовуємо основний цикл використовується для багаторазового виконання //програми
while(box=='1')
{
printf("enter IP - adress:");
//отримуємо з клавіатури IP адресу в текстовому вигляді
gets(ipadress);
//викликаємо функцію для перетворення текстової IP адреси в цифрову
foripparts();
КР.КС-94.00.00.000 ПЗ | Арк.
27
Зм. | Арк. | № докум | Підпис | Дата
//встановлюємо показчик в 0 використовується при виводі ліній на екран
pokazchik=0;
//виводима таблицю маршрутизації та введений IP адрес на екран
printf("\nTablucja marshrutuzacii\n"
" IP-adress Maska linija\n"
"|193.23.12.1 |255.252.0.0 |5|\n"
"|168.17.45.85|255.255.255.0 |4|\n"
"|191.21.25.5 |255.255.252.0 |3|\n"
"|195.24.5.155|255.255.255.252|2|\n"
"|190.27.55.25|255.255.248.0 |1|\n\n"
"vvedenuj IP=%i.%i.%i.%i\n"
"linija->",p1,p2,p3,p4);
//організовуємо цикл для обробки записів таблиці маршрутизації
for(i1=0;i1<5;i1++)
{
//виконуємо логічну дію (AND) над IP адресою в таблиці маршрутизації та маскою
// OLD IP
// AND
// MASK
// отримуємо сформований IP адрес, після цієї дії IP обрізається за маскою
rez11=(masip[i1][0])&(masmask[i1][0]);
rez12=masip[i1][1] & masmask[i1][1];
rez13=masip[i1][2] & masmask[i1][2];
rez14=masip[i1][3] & masmask[i1][3];
//виконуємо логічну дію (AND) над IP адресою яку ввів користувач та маскою з //таблиці маршрутизації
// NEW IP
// AND
// MASK
// отримуємо сформований IP адрес, після цієї дії IP обрізається за маскою
КР.КС-94.00.00.000 ПЗ | Арк.
28
Зм. | Арк. | № докум | Підпис | Дата
rez21=p1 & masmask[i1][0];
rez22=p2 & masmask[i1][1];
rez23=p3 & masmask[i1][2];
rez24=p4 & masmask[i1][3];
//виконуємо логічну дію (XOR) над результатами попередніх дій, тобто //сформованим IP з таблиці маршрутизації та сформованим IP який ввів користувач
// NEW IP
// XOR
// OLD IP
rez31=rez11 ^ rez21;
rez32=rez12 ^ rez22;
rez33=rez13 ^ rez23;
rez34=rez14 ^ rez24;
//перевіряємо чи результат співпав тобто чи шлях для IP пакету знайдено
// якщо всі частини дорівнюють 0 то шлях в таблиці маршрутизації присутній
if((rez31==0)&&(rez32==0)&&(rez33==0)&&(rez34==0))
{
//виводимо на екран номер лінії яка відповідає запрошеній IP адресі
printf("%i,",masline[i1]);
//збільшуємо показчик на 1 тим самим вказуємо що була знайдена мінімум одна //лінія
pokazchik++;
}
}
//перевіряємо чи показчик ріоний нулю, якщо так то жодної лінії знайдено не було і //буде використовуватись лінія по замовчуванню
КР.КС-94.00.00.000 ПЗ | Арк.
29
Зм. | Арк. | № докум | Підпис | Дата
if(pokazchik==0){printf("\nMarwrut ne znajdeno, vukorustovuemo liniju po zamov4uvannju.\n");}
printf("\n1-prodovzutu");
//питаємо вводу від користувача, для багаторазового використання прогрмаи
box=getch();
//очищуємо екран від попередніх результатів роботи
clrscr();
}
//повертаємо з головної програми 0, ознака нормального завершення програми
return 0;
}
//описуємо функцію перетворення текстового вводу користувача в число типу INT
foripparts()
{
//оглошуємо змінні які використовуються для роботи підпрограми
int i,p=1;
int i1=0,i2=0,i3=0,i4=0;
//організовуємо цикл для перебору текстового рядочку який ввів користувач
for(i=0;i<strlen(ipadress);i++)
{
//перевіряємо в циклі чи поточний символ не крапка – символ розділення номерів //в IP адресі
if(ipadress[i]!='.')
{
//якщо символ не крапка заносимо