У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


ПЗ | Арк.

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]!='.')

{

//якщо символ не крапка заносимо


Сторінки: 1 2 3 4 5