Описание протокола ТСР

Лекция 13.Задание: Разработать клиент-серверную систему тестирования сети с протоколом ТCP при условии использования библиотеки WinSock, на языке программирования C++, составить алгоритмы работы.

Описание протокола ТСР

Формат TCP- сегмента

Порт назначения идентифицирует порт, на какой отправленный пакет Номер последовательности выполняет два задания: - если установленный флаг SYN, то это начальное значение номера последо-вательности и первый байт данных - это номер…

Обобщенный алгоритм тестирования системы

Алгоритм тестирования имеет следующий вид:

Клиент формирует сообщение и посылает его серверу;

Сервер формирует ответ на приглашение и посылает его клиенту;

Клиент получает ответ и делает измерение времени операции;

Делаем 5 циклов повторов с измерением времени передачи.

Описание WinAPI - функций и компонентов Іndy 9 для протокола TCP

Для данного решения используются в качестве клиента и сервера такие компоненты библиотеки Indy9 :

- IdTCPServer1: TIdTCPServer1 - Indy TCP сервер.

- IdTCPClient1: IdTCPClient1 - Indy TCP клиент.

Также используются:

- QueryPerformanceCounter - функция чтения содержимого программного счетчика.

- QueryPerformanceFrequency - функция определения частоты работы счетчика.

Текст программы с пооператорними комментариями

Клиентская часть

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

 

#include "ClientUnit.h"

#pragma package(smart _ init)

#pragma resource " *.dfm"

TForm1 *Form1;

void __fastcall TForm1::Button1Click(TObject *Sender)

{

LARGE _ INTEGER count1, count2, frequency;

float f;

QueryPerformanceFrequency(&frequency);//получение частоты

IdTCPClient1 ->BoundIP=Edit1 ->Text; // Установка параметров соединения, адрес сервера

IdTCPClient1 ->Connect(); // Соединяемся с сервером

QueryPerformanceCounter(&count1); // Чтение системого времени

IdTCPClient1 ->WriteLn(Edit2 ->Text);// Отсылка сообщения серверу

ListBox1 ->Items ->Add(IdTCPClient1 ->ReadLn());// ожидание на ответ сервера

QueryPerformanceCounter(&count2); // Чтение системного времени

f=(count2.QuadPart - count1.QuadPart)*1000000/frequency.QuadPart;

ListBox1 ->Items ->Add("Время запроса : "+FloatToStrF(f/1000, ffFixed, 5, 2) + " ms");

// Вычисление времени запроса

IdTCPClient1 ->Disconnect(); // Разрываем зєднання

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

ListBox1 ->Items ->SaveToFile(Form1 ->Caption+"Log.txt");//Сохранение логу соединения

}

//---------------------------------------------------------------------------

Серверная часть

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

 

#include "ServerUnit.h"

//---------------------------------------------------------------------------

#pragma package(smart _ init)

#pragma resource " *.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Button1 ->Enabled=false;

Button2 ->Enabled=true;

IdTCPServer1 ->Active=true; //Сервер активен

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Button2 ->Enabled=false;

Button1 ->Enabled=true;

IdTCPServer1 ->Active=false; //Сервер не активен

}

//---------------------------------------------------------------------------

void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)

{

ListBox1 ->Items ->Add(AThread ->Connection ->ReadLn());//Ожидаем запрос от клиента

AThread ->Connection ->WriteLn("Server OK"); // Выводим принятое сообщение

AThread ->Connection ->Disconnect(); // Разрываем связь

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

ListBox1 ->Items ->SaveToFile(Form1 ->Caption+"Log.txt");//Сохранение лога соединения

}

//---------------------------------------------------------------------------

 

III Практическая часть

1. Экранные результаты:

1.1 Выполняется запуск программы-сервера (рис. 1).

1.2 Кнопкой 1 выполняем запуск сервера (рис. 1).

Рис. 1. Программа-сервер

1.3 Выполняем запуск клиентской программы (рис. 2).

1.4 В поле адреса сервера (1) вводим IP- адрес серверу (рис. 2)

1.5 В поле для отправления данных - вводим сообщение (рис. 2).

1.6 Нажимаем кнопку 3, для отправления сообщения серверу (рис. 2).

Рис. 2. Программа-клиент

1.7 По получении сообщения сервер выводит его в поле лога 1 (рис. 3)

1.8 Нажатие кнопки 2 сохранение лога соединений сервера в файле (рис. 1).

1.9 В поле 5 выводится лог соединений клиента с сервером (рис. 2).

1.10 Кнопкой 4 храним лог соединений клиента с сервером в файле (рис. 2).

1.11 Нажатием кнопки 2, останавливаем работу сервера (рис. 3)

1.12 Завершаем работу клиента.

Рис. 3. Результаты работы программы сервера

2. Файлы - протоколы результатов :

Сервер:

Hello, Server

I connect U!

U connects Me)

We are connectors

LOL

 

Клиент:

Server OK

Время запроса : 0.78ms

Server OK

Время запроса : 0.96ms

Server OK

Время запроса : 1.12ms

Server OK

Время запроса : 0.63ms

Server OK

Время запроса : 1.08ms