Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач ЭВМ.docx
Скачиваний:
9
Добавлен:
28.08.2019
Размер:
104.86 Кб
Скачать

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА № 51

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

доц., к.т.н.

Горбачев С.В.

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОМУ ПРОЕКТУ

«ПРОЕКТИРОВАНИЕ КОЛЬЦЕВОЙ ЛВС»

по курсу: «СЕТИ ЭВМ И ТЕЛЕКОММУНИКАЦИИ»

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР.

5812

Асанов Д.А.

подпись, дата

инициалы, фамилия

Санкт-Петербург

2011

Содержание

«ПРОЕКТИРОВАНИЕ КОЛЬЦЕВОЙ ЛВС» 1

1. Описание принципов работы ЛВС с детерминированным доступом и обоснование модели кольца со вставными регистрами 13

1.1. Описание принципов работы ЛВС с детерминированным доступом 13

1.2. Обоснование модели кольца со вставными регистрами. 16

2. Анализ эквивалентной модели станции ЛВС 18

3. Определение функциональных зависимостей основных характеристик проектируемой ЛВС 22

4. Разработка протокола на основе локально-приоритетного доступа и описание используемого формата кадра 29

5. Листинг программы на языке C++, моделирующей работы сети 30

#include "stdio.h" 30

#include "conio.h" 30

#include "stdlib.h" 30

#include "cstdlib" 30

#include "ctime" 30

#define cls system("cls") 30

#define wait while(!kbhit()) 31

#define N 100 // Количество станций 31

#define max_size 51 31

struct Packet{ 31

int preambula[6]; 31

int address[8]; 31

int sender[8]; 31

int type; 31

int size[6]; 31

int *data; 31

int *FSC; 31

int count[8]; 31

}; 31

int pream[6] = {1,1,0,0,1,1}; 31

void print_pack(struct Packet Pack,int size); 31

int get_addr(struct Packet pack); 31

int get_send(struct Packet pack); 31

int get_count(struct Packet pack); 31

void wait_q(); 31

void main(){ 31

struct Packet pack; 31

struct Packet pack_0,ans; 31

srand(time(NULL)); 31

int c,a,b,size; 31

int i,end,station,j; 31

do{ 31

cls; 31

printf("Select action\n"); 31

printf("1 - random adress\n"); 31

printf("2 - set adress\n"); 31

printf("3 - exit\n"); 31

wait; 31

c = getch(); 31

if (c == '3') return; 31

if (c == '2'){ 31

do{ 31

cls; 31

printf("Enter adress, it may be between 1-%d\n",N); 31

scanf("%d",&b); 31

}while((b < 1) || (b > N)); 31

do{ 31

cls; 31

printf("Enter sender, it may be between 1-%d and <>%d\n",N,b); 31

scanf("%d",&a); 31

}while((a == b) || (a < 1) || (a > N)); 31

do{ 31

cls; 31

printf("Enter a size, it may be between 0-%d\n",max_size); 31

scanf("%d",&size); 31

}while((size < 0) || (size > max_size)); 31

} 31

else{ 31

a = (rand() % N) + 1; 31

do{ 31

b = (rand() % N) + 1; 31

}while (a == b); 31

size = rand() % (max_size + 1); 31

} 31

// Формирование преамбулы 31

for (i = 0;i != 6;++i) 32

pack.preambula[i] = pream[i]; 32

// Формирование адреса 32

for (i = 0;i != 8;++i) 32

pack.address[i] = ((b - 1) >> i) % 2; 32

// Формирование отправителя 32

for (i = 0;i != 8;++i) 32

pack.sender[i] = ((a - 1) >> i) % 2; 32

// Формирование размера 32

for (i = 0;i != 6;++i) 32

pack.size[i] = (size >> i) % 2; 32

// Формирование типа 32

pack.type = 0; 32

// Формирование данных 32

pack.data = new int [size*8]; 32

if (pack.data == NULL) 32

return; 32

for (i = 0;i != size*8;++i) 32

pack.data[i] = rand() % 2; 32

// Формирование поля контрольной суммы 32

pack.FSC = new int [size + 4]; 32

if (pack.FSC == NULL){ 32

delete []pack.data; 32

return; 32

} 32

for (c = 0,i = 0;i != 8;++i) 32

c += pack.preambula[i]; 32

pack.FSC[0] = c % 2; 32

for (c = 0,i = 0;i != 8;++i) 32

c += pack.address[i]; 32

pack.FSC[1] = c % 2; 32

for (c = 0,i = 0;i != 8;++i) 32

c += pack.sender[i]; 32

pack.FSC[2] = c % 2; 32

c = pack.type; 32

for (i = 0;i != 6;++i) 32

c += pack.size[i]; 32

pack.FSC[3] = c % 2; 32

for (c = 0,i = 0;i != size*8;++i){ 32

c += pack.data[i]; 32

if (i % 8 == 7){ 32

pack.FSC[i / 8 + 4] = c % 2; 32

c = 0; 32

} 32

} 32

// Формирование поля счетчика 32

for (i = 0;i != 8;++i) 32

pack.count[i] = 0; 32

// Сохранение пакета 32

pack_0 = pack; 32

pack_0.data = new int [size * 8]; 32

if (pack_0.data == NULL){ 32

delete [] pack.FSC; 32

delete [] pack.data; 32

return; 32

} 32

for (i = 0;i != size*8;++i) 32

pack_0.data[i] = pack.data[i]; 32

pack_0.FSC = new int [size + 4]; 32

if (pack_0.FSC == NULL){ 32

delete [] pack.data; 32

delete [] pack.FSC; 32

delete [] pack_0.data; 33

return; 33

} 33

for (i = 0; i != size+4;++i) 33

pack_0.FSC[i] = pack.FSC[i]; 33

do{ 33

end = 0; 33

for (i = 0;i != 8;++i){ 33

pack.preambula[i] = pack_0.preambula[i]; 33

pack.address[i] = pack_0.address[i]; 33

pack.sender[i] = pack_0.sender[i]; 33

pack.count[i] = pack_0.count[i]; 33

} 33

for (i = 0;i != 6;++i) 33

pack.size[i] = pack_0.size[i]; 33

pack.type = pack_0.type; 33

for (i = 0;i != size*8;++i) 33

pack.data[i] = pack_0.data[i]; 33

for (i = 0;i != size;++i) 33

pack.FSC[i] = pack_0.FSC[i]; 33

// Вывод пакета на экран 33

cls; 33

printf("The station %d generate to station %d the next packet\n",a,b); 33

print_pack(pack,size); 33

printf("press any key to emulate\n"); 33

wait; 33

c = getch(); 33

cls; 33

// Запрос об ошибке 33

printf("Select an action\n"); 33

printf("1 - leave correct\n"); 33

printf("2 - make error\n"); 33

wait; 33

c = getch(); 33

cls; 33

if (c == '2'){ 33

cls; 33

printf("Where are you want to do error\n"); 33

printf("1 - adress\n"); 33

printf("2 - sender\n"); 33

printf("3 - data\n"); 33

wait; 33

c = getch(); 33

switch (c){ 33

case '1': 33

i = rand() % 8; 33

pack.address[i] ^= 1; 33

break; 33

case '2': 33

i = rand() % 8; 33

pack.sender[i] ^= 1; 33

break; 33

case '3': 33

i = rand() % (size*8); 33

if (size != 0) 33

pack.data[i] ^= 1; 33

break; 33

default: 33

break; 33

} 33

cls; 33

printf("Packet with error\n"); 33

print_pack(pack,size); 34

} 34

station = a; 34

while(true){ 34

++station; 34

if (station == (N + 1)) station = 1; 34

printf("Packet at station %d\n",station); 34

i = get_addr(pack) + 1; 34

if (station == i){ // В пакете написано что пакет для этой станции 34

if (i == b){ // Станция ждет этот пакета 34

if (a != get_send(pack) + 1){ 34

printf("Station %d do not wait packer from station %d\n",station,get_send(pack)+1); 34

wait_q(); 34

break; 34

} 34

// Проверка контрольной суммы 34

j = 0; 34

for (i = 0,c = 0;i != 8;++i) 34

c += pack.address[i]; 34

if (pack.FSC[1] != c % 2) 34

j = 1; 34

for (i = 0,c = 0;i != 8;++i) 34

c += pack.sender[i]; 34

if (pack.FSC[2] != c % 2) 34

j = 1; 34

c = pack.type; 34

for (i = 0;i != 6;++i) 34

c += pack.size[i]; 34

if (pack.FSC[3] != c % 2) 34

j = 1; 34

for (i = 0,c = 0;i != size*8;++i){ 34

c += pack.data[i]; 34

if (i % 8 == 7){ 34

if (pack.FSC[i / 8 + 4] != c % 2){ 34

j = 1; 34

break; 34

} 34

c = 0; 34

} 34

} 34

if (j == 1){ // Ошибка по контрольной сумме 34

printf("Station %d was delete a packet because of error on FSC\n",station); 34

wait_q(); 34

break; 34

} 34

else{ // Формирование ответного пакета 34

printf("Station %d was take packet\n",station); 34

wait_q(); 34

printf("Station %d was generate to station %d the next packet\n",station,a); 34

ans.data = NULL; 34

ans.FSC = new int [3]; 34

ans.type = 1; 34

for (i = 0;i != 8;++i){ 34

ans.count[i] = 0; 34

ans.address[i] = pack.sender[i];ans.FSC[1] = (ans.FSC[1] + ans.address[i]) % 2; 34

ans.sender[i] = pack.address[i];ans.FSC[2] = (ans.FSC[2] + ans.sender[i]) % 2; 34

ans.preambula[i] = pack.preambula[i];ans.FSC[0] = (ans.FSC[0] + ans.preambula[i]) % 2; 35

} 35

ans.FSC[3] = 1; 35

for (i = 0;i != 6;++i) 35

ans.size[i] = 0; 35

print_pack(ans,0); 35

for (i = station + 1;i != a;++i){ 35

wait; 35

c = getch(); 35

if (i == N + 1) 35

i = 1; 35

printf("Packet at station %d\n",i); 35

} 35

printf("Station %d was take packet\n",a); 35

end = 1; 35

printf("Emulate was complete\n"); 35

wait_q(); 35

break; 35

} 35

} 35

else{ // Ошибка пакет надо изъять 35

printf("Station %d was delete a packet because of error in addres\n",station); 35

wait_q(); 35

break; 35

} 35

} 35

else{ // Пакет не для этой станции 35

i = get_count(pack); 35

if (i == 255){ // Ошибка пакет надо изъять 35

printf("Station %d was delete a packet besause of KS\n",station); 35

wait_q(); 35

break; 35

} 35

else{ // Увеличить счетчик count 35

for (i = 0,c = 1;i != 8;++i) 35

if (c == 1) 35

if (pack.count[i] == 1) 35

pack.count[i] = 0; 35

else{ 35

pack.count[i] = 1; 35

c = 0; 35

} 35

} 35

} 35

wait; 35

c = getch(); 35

} 35

}while(!end); 35

delete [] pack.data; 35

delete [] pack.FSC; 35

}while(true); 35

} 35