Лабораторный практикум - Чувашский государственный

advertisement
Федеральное агентство по образованию
Федеральное государственное образовательное учреждение
высшего профессионального образования
«Чувашский государственный университет им. И.Н. Ульянова»
Технический институт
Факультет дизайна и компьютерных технологий
Кафедра компьютерных технологий
Сетевые технологии
ЛАБОРАТОРНЫЙ ПРАКТИКУМ
Направление: 654600 – Информатика и вычислительная техника (ИВТ)
Специальность: 230102 – Автоматизированные системы обработки информации и управления (АСОИУ)
Составитель: доцент кафедры компьютерных технологий
А.П. Димитриев
Чебоксары – 2009
Требования государственного образовательного стандарта
Инженер по информатике и вычислительной технике
должен знать принципы, методы и способы комплексирования
аппаратных и программных средств при создании вычислительных систем, комплексов и сетей; должен владеть методами объединения средств вычислительной техники в комплексы, системы и сети. Инженер по специальности "Автоматизированные
системы обработки информации и управления" должен знать:
- принципы организации и функционирования ЭВМ, вычислительных систем комплексов и сетей, их компоненты, характеристики, архитектуру, возможные области применения;
- методы распределенной обработки информации, современные сетевые технические и программные средства, модели и
структуры информационных сетей, оценки их эффективности,
сетевые технологии;
- должен владеть современными сетевыми технологиями.
Инженер подготовлен к решению следующих профессиональных задач: комплексирование аппаратных и программных
средств, создание вычислительных систем, комплексов и сетей.
Лабораторная работа 1. Служебная утилита telnet.
Цель работы: ознакомление c утилитой telnet.
Теоретический материал.
Telnet - сетевой протокол для реализации текстового
интерфейса по сети. Название «telnet» имеет также утилита,
реализующая клиентскую часть протокола. Исторически telnet
служил для удалённого доступа к интерфейсу командной строки
операционных систем. Протокол telnet может использоваться
для выполнения отладки других протоколов на основе
транспорта TCP.
Утилита telnet поддерживает следующие команды:
 Close – закрытие текущего подключения.
 Display – отображение параметров операции.
 Open – подключение к сайту.
 Quit – выход из telnet.
 Set – установление параметров.
 Send – отправление строки на сервер.
 Status – вывод сведений о текущем состоянии.
 Unset – сброс параметров.
Используя утилиту telnet можно, например, вручную отправить запрос клиента и получить ответ сервера по протоколу
HTTP.
Для этого выполним следующую последовательность
действий:
1. Запуск утилиты telnet
2. Установление соединения с веб-сервером с помощью
команды:
open имя_хоста 80
1. Формирование запроса клиента
2. Получение ответа сервера
Пример
1. Устанавливаем соединение:
open localhost 80
2. Формируем строку состояния запроса клиента:
GET HTTP://LOCALHOST/PERLCALC.HTML HTTP/1.0
<ENTER><ENTER>
3. Получаем ответ сервера:
3
Видно, что ответ веб-сервера localhost содержит строку
состояния (с кодом успешного завершения 200), поля заголовка
(Server, Date, Content-type и др.) и тело, содержащее HTML код
запрошенного клиентом документа http://localhost/perlcalc.html.
Задание. Ознакомление с протоколом HTTP с помощью
утилиты telnet.
1) Запустите сеанс telnet (запускается в командной строке командой telnet). При этом появится подсказка Microsoft
Telnet>. С полным списком команд можно ознакомиться с
помощью команды help.
2) Разрешите режим отображения вводимых с клавиатуры
символов с помощью команды set localecho.
3) В соответствии с протоколом HTTP необходимо установить
соединение с веб-сервером. Для этого с помощью команды
open устанавливается соединение, например: open
www.yandex.ru 80.
4) Сформируйте клиентский запрос. Как минимум он должен
содержать строку состояния, например:
GET HTTP://WWW.YANDEX.RU/INDEX.HTML HTTP/1.0
Если поля запроса отсутствуют, то ввод заканчивается
двумя нажатиями клавиши <ENTER> для вставки пустой
строки после заголовка.
4
Следует обратить внимание на то, что при вводе нельзя
допускать ошибок, поскольку при попытке их исправить с
помощью
клавиши
<BACKSPACE>,
ее
нажатие
интерпретируется как часть запроса.
5) Изучите полученный ответ сервера. Обратите внимание на
код ответа в строке состояния ответа веб-сервера в строке
состояния и поля заголовка ответа.
Если ответ сервера очень большой (в первую очередь из-за
размера документа в теле ответа), то содержимое ответа
сервера в окне интерпретатора командной строки
обрезается с начала. В этом случае рекомендуется для
просмотра заголовка вместо метода GET использовать
метод HEAD.
5
Лабораторная работа №2
6
7
8
1.4. Задание
1. Ознакомиться с теоретическим материалом.
2. Произвести оценку конфигурации сети в соответствии с вариантом
(вариант соответствует порядковому номеру в списке группы):
9
10
5.Включить в отчет ответы на контрольные вопросы.
11
12
13
14
15
16
Вариант 14
Вариант 13
17
Вариант 15
18
Вариант 16
Вариант 18
Вариант 17
19
20
Лабораторная работа № 3
РАСЧЁТ ПО ДВУМ ЛВС: С ШИННОЙ СТРУКТУРОЙ, С
ТАКТИРУЕМЫМ ДОСТУПОМ.
Задание на лабораторную работу
1. Рассчитать время доставки сообщения и сравнить его с
минимальным.
2. Построить графики зависимости нормированного времени
доставки сообщения от коэффициента загрузки канала.
3. Сравнить эффективность работы сетей с помощью графиков.
Варианты:
Протя- Число
Номер
ПротяЧисло
Номер
женстанВариженность
стан1/c
Вари1/c
ность
ций
анта
сети S
ций М
анта
сети S
М
1
1,5 км
25
11
18
1,5 км
25
15
2
1,6 км
50
13
19
1,6 км
50
56
3
1,7 км
25
14
20
1,7 км
25
23
4
1,8 км
48
15
21
1,8 км
48
12
5
0,5 км
25
33
22
0,5 км
25
13
6
1 км
56
44
23
1,5 км
56
14
7
1,1 км
25
55
24
1,5 км
26
15
8
0,3 км
25
23
25
1,5 км
27
25
9
1,5 км
30
34
26
0,4 км
28
45
10
1,5 км
25
23
27
0,3 км
25
56
11
1,5 км
17
12
28
1,5 км
25
34
12
1,5 км
18
23
29
0,5 км
25
56
13
1,5 км
19
34
30
1,1 км
25
24
14
1,5 км
20
45
31
1,2 км
25
45
15
1,5 км
34
55
32
1,6 км
25
13
16
1,5 км
40
34
33
0,7 км
25
14
17
1,5 км
21
28
34
0,5 км
25
15
Расчет кольцевой ЛВС с тактируемым доступом
Рассмотрим кольцевую ЛВС с тактируемым доступом,
имеющую
топологию,
соответствующую
рис.
12
и
удовлетворяющую следующим исходным данным:
21
22
О1
Oi
ретранслятор
OM
СТ 4
СТ 10
7 АС
П1
Пi
ПМ
5 АС
Сегмент 4 – 70 м
Сегмент 10 – 25 м
СТ 3
Рис.12. Модель кольцевой ЛВС с тактируемым доступом
- продолжительность сети S – брать из таблицы с номером варианта
- число станций М – брать из таблицы с номером варианта
- скорость модуляции В = 100 м бит/с.;
- скорость распространения сигнала по кабелю связи V = 2,31 0
км/с.;
- в сети используется однократный тактируемый доступ и
числом разрядов сдвигового
регистра станции в = 2;
- в сети действует Пуассоновский поток сообщений (
Сегмент 9 – 25 м
5 АС
5 АС
СТ 9
Сегмент 3 – 72 м
СТ 8
7 АС
СТ 2
Сегмент 8 – 66 м
4 АС
СТ 7
Сегмент 2 – 72 м
7 АС
= 1);
среднее
значение
интенсивности
сообщений,
поступающих от каждой станции
– брать из таблицы с номером варианта
- средняя длина сообщения Lc = 1600 бит;
- средняя длина информационной части сегмента d = 48 бит;
- длина служебной части сегмента h = 22 бит;
- сеть считается однородной.
Расчет ЛВС с шинной структурой
Расчет времени задержки доставки сообщений в сети со
случайным
доступом
произведем
на
примере
ЛВС,
обеспечивающий равные права доступа для всех станций
подключения аппаратуры абонентов к сети. К сегменту могут
подключаться не более 100 станций.
СТ 1
Сегмент 7 – 66 м
10 АС
Сегмент 1 – 10 м
Модуль
сопряжения
со средой
СТ 5
СТ 6
Сегмент 5 – 20 м
1 АС
2 АС
Сегмент 6 – 58 м
Рис.8. Структурная схема сети
Станция может быть удалена от сегмента не более, чем на
50 м. Максимальная длина сегмента - 500 м. Два сегмента могут
быть объединены между собой при помощи ретранслятора, уста23
24
навливаемого вместо станции (см. рис.8). На пути между любыми
двумя станциями не должно быть более двух ретрансляторов.
Минимальное расстояние между станциями 2,5 м, максимальное 1500. Задержка начала вывода кадра из ретранслятора (т.е.
промежуток времени между приемом и выдачей кадра) не должна
превышать 14,5 битовых интервала. Длина битового интервала
составляет 100 нс.
Объединяя сегменты через ретрансляторы, можно
построить сложную сеть. ЛВС имеет топологию дерева без корня.
Спецификация сети предусматривает физический канал в виде
коаксиального кабеля со скоростью передачи 10 Мбит/с.
Зададим следующие исходные данные сети:
- протяженность сети S – брать из таблицы с номером
варианта, это максимальное расстояние между двумя станциями;
- скорость модуляции В = 10 Мбит/с;
- число станций М – брать из таблицы с номером варианта
- скорость распространения сигнала по кабелю связи V =
2,3 105 км/с;
- максимальное число ретрансляторов - nр между двумя
станциями nр = 2;
- максимальная задержка одного ретранслятора в битах L p
= 14 бит;
- тип протокола, из которого устанавливается: средняя
длина информационной части
кадра LH = 1600 бит;
- средняя длина служебной части кадра Lc = 320 бит;
- закон распределения длин информационной части кадра
(обычно экспоненциальный)
;
- закон распределения длин служебной части кадра
(обычно детерминированный)
;
среднее
значение
интенсивности
сообщений,
поступающих от каждой станции
ср – брать из таблицы с номером варианта
Обычно сеть принимается однородной.
Составить письменный отчёт по лабораторной работе.
Содержание отчёта.
1. Цель работы и задание, выданное преподавателем.
2. Результаты расчётов (в виде таблиц и графиков).
3. Выводы.
25
Лабораторная работа № 4. Организация обработки
распределенных данных.
Задание. Написать программу на одном из языков программирования для обработки распределенных данных. Программа
должна запускаться в сети. В качестве данных, которая программа
обрабатывает, используется ввод с клавиатуры (как чат).
Пример программы на клиенте следующий.
unit Unit1;{
-----------------Infa----------------Created by Zapevalov Dima 2003 Ivanovo
E-mail: ZDima1987@mail.ru
Home Page: http://www.zdima-iv.nm.ru/
-------------------------------------}interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls, ToolWin, ComCtrls, Buttons;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket; ToolBar1: TToolBar;
Label5: TLabel; Edit4: TEdit; Button3: TButton; Button5: TButton;
Image1: TImage; Label2: TLabel; Edit3: TEdit; Label3: TLabel;
ToolBar2: TToolBar; Edit2: TEdit; Button1: TButton;
ListBox1: TListBox; ListBox2: TListBox; Button2: TButton;
SpeedButton1: TSpeedButton; SaveDialog1: TSaveDialog;
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Edit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ListBox2Click(Sender: TObject);
procedure ListBox2DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
26
procedure Button2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1; nick:string;
implementation
{$R *.dfm}
function GetCompName:string;
var Len:Cardinal; pStr:PChar;
begin pStr:=nil; Len:=256;try pStr:=StrAlloc(Len);
if GetComputerName(pStr,Len) then Result:=pStr; finally
if pStr<>nil then StrDispose(pStr); end;end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);begin
//ListBox2.Items.Add(TimeToStr(now)+' Подрубилсь '+Socket.ReceiveText+'
'+Socket.RemoteHost+' '+Socket.RemoteAddress);
Image1.Visible:=true;//Button1.Enabled:=true;
Socket.SendText('Ne>'+nick);sleep(100);Socket.SendText('>G<');end;
procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);begin
//ListBox2.Items.Add(TimeToStr(now)+' Подрубаеться '+Socket.ReceiveText+'
'+Socket.RemoteHost+' '+Socket.RemoteAddress);
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);begin
//ListBox2.Items.Add(TimeToStr(now)+' Disconnect '+Socket.ReceiveText+'
'+Socket.RemoteHost+' '+Socket.RemoteAddress);
Image1.Visible:=false;//Button1.Enabled:=false;end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);begin
//ListBox2.Items.Add(TimeToStr(now)+' - Error :-((( а жалко
--для тех кто
не понял-ОШИБКА');end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);var mes,names,n,mmm:string; i:integer;
begin mes:=Socket.ReceiveText;
if (mes[1]='m')and(mes[2]='m')and(mes[3]='m') then begin
mmm:=copy(mes,4,length(mes));ShowMessage(mmm);end;
if (mes[1]='(')and(mes[2]=')')and(mes[3]='=') then begin
names:=copy(mes,4,length(mes));names:=names+'= =';
i:=-1; ListBox1.Items.Clear;while n<>' ' do begin i:=i+1;
27
n:=''; while names[i+1]<>'='do begin i:=i+1;
n:=n+names[i] end; if n<>' ' then ListBox1.Items.Add(n); end;
end else if (mes[1]='<')and(mes[2]='S')and(mes[3]='>') then
Socket.SendText('Ne>'+nick)
else begin i:=ListBox2.Items.Add(mes); SendMessage(ListBox2.Handle,
LB_SETCURSEL, ListBox2.Items.Count-1,0); end; end;
procedure TForm1.Button1Click(Sender: TObject);begin
if (ListBox1.itemindex>=0) then begin
ClientSocket1.Socket.SendText(Nick+'>'+
ListBox1.Items[ListBox1.itemindex]+'>'+Edit2.Text); end else
ClientSocket1.Socket.SendText(Nick+'>All>'+Edit2.Text);Edit2.Text:='';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin ClientSocket1.Close;end;
procedure TForm1.Button5Click(Sender: TObject);
begin ClientSocket1.Port:=StrToInt(Edit3.Text); //2541;
ClientSocket1.Address:=Edit4.Text;ClientSocket1.Open;end;
procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if key=13 then Button1.Click; end;
procedure TForm1.FormResize(Sender: TObject);begin
Edit2.Width:=ToolBar2.Width-1;Edit2.Height:=ToolBar2.Height;
Edit4.Height:=ToolBar1.Height;Edit3.Height:=ToolBar1.Height;
ListBox1.Width:=ClientWidth div 4;ListBox2.Top:=0;
ListBox2.Left:=0;ListBox2.Width:=ClientWidth-ListBox1.Width-1;
ListBox1.Left:=ListBox2.Width+1;ListBox1.Top:=0;
ListBox1.Height:=ClientHeight-ToolBar1.Height-ToolBar2.Height;
listBox2.Height:=ListBox1.Height;
ListBox1.Height:=ListBox1.Height-Button2.Height-1;
Button2.Width:=ListBox1.Width;Button2.Left:=ListBox1.Left;
Button2.Top:=ListBox1.Height+1;end;
procedure TForm1.FormActivate(Sender: TObject);label beg; begin
beg:nick:=InputBox('Привет...','Введи своё имя',nick);
if length(nick)<4 then begin
ShowMessage('Имя из '+inttostr(length(nick))+' букв!'+#10+
'И как это понимать?'#10+'Должно быть хотябы 4'#10+'Пробани ещё раз'); goto
beg end;ListBox2.Items.Clear;
ListBox2.Items.add('Computer''s name - '+getcompname);
ListBox2.Items.Add('Привет, твой ник - "'+nick+'", приятной болтавни...');
SendMessage(ListBox2.Handle,LB_SETCURSEL,ListBox2.Items.Capacity,0);
end;
procedure TForm1.ListBox2Click(Sender: TObject);var s:string;begin
try s:=ListBox2.Items[ListBox2.itemindex];
ListBox2.Canvas.Font:=ListBox2.Font;
if Canvas.TextWidth(s)>=ListBox2.Width then begin
ListBox2.Hint:=s; ListBox2.ShowHint:=true; end else begin
ListBox2.ShowHint:=false; ListBox2.hint:=''; end;except end;end;
28
procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);var k,f,al:string; x:integer;
begin k:=copy(ListBox2.Items[index],1,length(nick));
if k=nick then ListBox2.Canvas.Brush.Color:=$00FDD6A6 else begin
k:=ListBox2.Items[index]+'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>';
f:='dima'; x:=0;while F[1]<>'>'do begin x:=x+1; F[1]:=k[x] end;
f:=copy(k,x+1,length(nick)); al:=copy(k,x+1,3);
if f=nick then ListBox2.Canvas.Brush.Color:=$00FACEFF else
if al='All'then ListBox2.Canvas.Brush.Color:=$00C1E4FF else
ListBox2.Canvas.Brush.Color:=$00FFFFFF;end;
ListBox2.Canvas.Font.Color:=$000000;ListBox2.Canvas.FillRect(rect);
ListBox2.Canvas.TextOut(Rect.Left+1,Rect.Top+2,ListBox2.Items[index]);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin ListBox1.ItemIndex:=-1;end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin if SaveDialog1.Execute then
ListBox2.Items.SaveToFile(SaveDialog1.FileName+'.txt');end;
procedure TForm1.Label3Click(Sender: TObject);
begin WinExec('explorer http://www.zdima-iv.nm.ru/',1);end;
end.
На сервере.
unit Unit1;{
-----------------Infa----------------Created by Zapevalov Dima 2003 Ivanovo
E-mail: ZDima1987@mail.ru Home Page: http://www.zdima-iv.nm.ru/
-------------------------------------}interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls, Buttons, Spin, ToolWin, ComCtrls;
type TForm1 = class(TForm)
ServerSocket1: TServerSocket; ToolBar2: TToolBar;
Image1: TImage; Image2: TImage; Label1: TLabel;
Label2: TLabel; Button1: TButton; SpinEdit1: TSpinEdit;
Button4: TButton; ToolBar3: TToolBar; Edit1: TEdit;
Button2: TButton; ListBox1: TListBox; Memo1: TListBox;
Button3: TButton; Button5: TButton; SpeedButton1: TSpeedButton;
SaveDialog1: TSaveDialog; procedure Button1Click(Sender: TObject);
procedure ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
29
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Memo1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Memo1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure Button5Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure Label2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations } end;
var Form1: TForm1; Nick:string;
implementation
{$R *.dfm}
function GetNicks(listbox1:TListBox):string;
var ii:integer; names:string;begin
for ii:=0 to ListBox1.Items.Capacity-1 do
names:=names+'='+ListBox1.Items[ii];result:='()'+names+'='+nick;end;
procedure TForm1.Button1Click(Sender: TObject);begin
ServerSocket1.Port:=SpinEdit1.Value;ServerSocket1.Open;
Button1.Enabled:=false;Button4.Enabled:=true;end;
procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);begin
//Memo1.Lines.Add(TimeToStr(now)+' Accept '+Socket.ReceiveText+' '+Socket.RemoteHost+'. IP - '+Socket.RemoteAddress);end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);begin
//Memo1.Lines.Add(TimeToStr(now)+' Connect'+Socket.ReceiveText+' '+Socket.RemoteHost+'. IP - '+Socket.RemoteAddress);
Image1.Visible:=true;Image2.Visible:=false;end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var ii,gf:integer; begin gf:=ListBox1.Items.Capacity-1;
30
ListBox1.Items.Clear; for ii:=0 to gf do
try ServerSocket1.Socket.Connections[ii].SendText('<S>');
except end;
//Memo1.Lines.Add(TimeToStr(now)+' ClientDisconnect '+Socket.ReceiveText+' '+Socket.RemoteHost+'. IP - '+Socket.RemoteAddress);Image1.Visible:=false;
Image2.Visible:=true;//Button2.Enabled:=false;end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);begin
//Memo1.Lines.Add(TimeToStr(now)+' Error code - '+inttostr(ErrorCode)+'
:(((');end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);var ii:integer; name,mes,names:string;
begin mes:=Socket.ReceiveText;name:=''; names:='';
if (mes[1]='N')and(mes[2]='e')and(mes[3]='>')then begin
name:=copy(mes,4,length(mes));ListBox1.Items.Add(name);
for ii:=0 to ListBox1.Items.Capacity do
try ServerSocket1.Socket.Connections[ii].SendText(GetNicks(ListBox1));
except end; end else
if (mes[1]='>')and(mes[2]='G')and(mes[3]='<')then begin
Socket.SendText(GetNicks(ListBox1));end else begin
Memo1.Items.Add(mes); for ii:=0 to ListBox1.Items.Capacity-1 do try
ServerSocket1.Socket.Connections[ii].SendText(mes);
except end;SendMessage(Memo1.Handle,LB_SETCURSEL,
Memo1.Items.Capacity-1,0);end;end;
procedure TForm1.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);var i:integer;begin
i:=Memo1.Items.Add(TimeToStr(now)+'- Listing... ');
SendMessage(Memo1.Handle,LB_SETCURSEL,i,0);end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer; begin if ListBox1.ItemIndex>-1 then
Edit1.Text:=Nick+'>'+ListBox1.Items[ListBox1.ItemIndex]+'> '+edit1.Text
else Edit1.Text:=Nick+'>All>'+edit1.Text;
for i:=0 to ListBox1.Items.Capacity-1 do try
ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);
except end;i:=Memo1.Items.Add(Edit1.Text);
SendMessage(Memo1.Handle,LB_SETCURSEL,i,0);
Edit1.Text:='';end;
procedure TForm1.Button4Click(Sender: TObject);
var i:integer; begin ServerSocket1.Close;
i:=Memo1.Items.Add(TimeToStr(now)+' - ServerSocket.Close');
SendMessage(Memo1.Handle,LB_SETCURSEL,i,0);
Button4.Enabled:=false;Button1.Enabled:=true;end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin Button4.Click;end;
function GetCompName:string;var Len:Cardinal; pStr:PChar;
31
begin pStr:=nil; Len:=256; try pStr:=StrAlloc(Len);
if GetComputerName(pStr,Len) then Result:=pStr; finally
if pStr<>nil then StrDispose(pStr); end;end;
procedure TForm1.FormActivate(Sender: TObject);label beg; begin
beg:nick:=InputBox('Привет...','Введи своё имя',nick);
if length(nick)<4 then begin
ShowMessage('Имя из '+inttostr(length(nick))+' букв!'+#10+
'И как это понимать?'#10+'Должно быть хотябы 4'#10+'Пробани ещё раз'); goto
beg end;Memo1.Items.Clear;
Memo1.Items.add('Computer''s name - '+getcompname);
Memo1.Items.Add('Привет, твой ник - "'+nick+'", приятной болтавни...');
end;
procedure TForm1.FormResize(Sender: TObject);begin
Edit1.Width:=ToolBar3.Width-1;Edit1.Height:=ToolBar3.Height;
Memo1.Left:=0;Memo1.Top:=0;ListBox1.Width:=ClientWidth div 4;
Memo1.Width:=ClientWidth-ListBox1.Width-1;ListBox1.Top:=0;
ListBox1.Left:=Memo1.Width+1;
Memo1.Height:=ClientHeight-ToolBar2.Height-ToolBar3.Height;
ListBox1.Height:=Memo1.Height-Button3.Height-1;
Button3.Top:=ListBox1.Height+1;Button3.Width:=ListBox1.Width;
Button3.Left:=ClientWidth-Button3.Width;Form1.Repaint;end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);var i,dd:integer; begin
dd:=ListBox1.Items.Capacity-1;if integer(Key)=vk_up then Button2.Click;
if (integer(Key)=vk_down)and(shift=[ssCtrl]) then begin
ShowMessage('DEBUG: send msg - '+Edit1.Text);
if Edit1.text='<S>'then ListBox1.items.Clear;for i:=0 to dd do try
ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);
except end;end;end;
procedure TForm1.Memo1Click(Sender: TObject);var s:string;
begin s:=Memo1.Items[Memo1.itemindex];
ListBox1.Canvas.Font:=ListBox1.Font;
if Canvas.TextWidth(s)>=Memo1.Width then begin
Memo1.Hint:=s; Memo1.ShowHint:=true; end else begin
memo1.ShowHint:=false; memo1.hint:=''; end;end;
procedure TForm1.Button3Click(Sender: TObject);begin
ListBox1.ItemIndex:=-1;end;
{_________________________________________________________________}
procedure TForm1.Memo1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);vAr K,f,al:STRING; X:INTEGER;
BeGiN k:=copy(Memo1.Items[index],1,length(nick));
If k=nick THEN Memo1.Canvas.Brush.Color:=$00FDD6A6 Else Begin
k:=Memo1.Items[index]+'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>';
f:='dima'; x:=0;While F[1]<>'>'Do Begin x:=x+1; F[1]:=k[x] End;
f:=copy(k,x+1,length(nick)); al:=copy(k,x+1,3);
If f=nick Then Memo1.Canvas.Brush.Color:=$00FACEFF Else
32
if al='All'then Memo1.Canvas.Brush.Color:=$00C1E4FF else
Memo1.Canvas.Brush.Color:=$00FFFFFF;End;
Memo1.Canvas.Font.Color:=$000000;Memo1.Canvas.FillRect(rect);
Memo1.Canvas.TextOut(Rect.Left+1,Rect.Top+2,Memo1.Items[index]);
End;
{__________________________________________________________}
procedure TForm1.Button5Click(Sender: TObject);begin
ShowMessage('Server of Chat messages:'#10+
'<S> - Get client names'#10+'()=?=? - Send user List format');end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin if SaveDialog1.Execute then
Memo1.Items.SaveToFile(SaveDialog1.FileName+'.txt');end;
procedure TForm1.Label2Click(Sender: TObject);
begin WinExec('explorer http://www.zdima-iv.nm.ru/',1);end;End.
Лабораторная работа № 5. Исследование алгоритмов
маршрутизации сообщений1
Задание. Изучить алгоритмы маршрутизации сообщений. Написать программу на одном из языков программирования, реализующую один из данных алгоритмов. Использовать модель сети,
требующую маршрутизации, и реализовать ее в программе.
Пример модели.
Несмотря на то, что компьютеры 1,2,3,4,5 в локальной сети, они
как бы роутеры (маршрутизаторы). Они отправляют сообщения
друг другу в случайные моменты времени. Это реализуется использованием компонента Таймер и его обработчика событий
OnTimer, которое определяет, что должна делать программа, когда истечет заданный интервал, и свойства таймера – Interval в
миллисекундах.
Искусственно вводится топология глобальной сети в виде матрицы (для разных вариантов разные матрицы; заполнить для
своего варианта матрицу произвольными различными числами):
№ роутера 1 2 3 4 5
1
0 25 25 35 60
2
30 0 50 40 25
3
20 85 0 45 50
4
40 30 20 0 40
Для заочников это контрольная работа (оформить с титульным листом, заданием и результатами).
1
33
5
90 30 35 25 0
Здесь указана стоимость доставки сообщения от одного роутера
до другого. Эта матрица хранится во всех роутерах. Создаваемые сообщения передаются по маршруту наименьшей суммарной стоимости адресату, причем адрес адресата находится в сообщении. Например, для передачи от 5 к 1 роутеру стоимость
равна стоимости от 5 ко 2 (30) + от 2 к 1 (30) и равна 60. На всех
пяти компьютерах работает программа, создающая сообщения,
передающая их следующему компьютеру в соответствии с
маршрутом, и принимающая сообщения, если данный роутер
последний в маршруте. Маршруты определяются автоматически.
Лабораторная
работа
№
6.
Подсистема
административного управления.
Задание. Изучить функции подсистемы административного
управления локальной сетью. Использовать некоторые из данных функций для администрирования локальной сети.
Установка сетевой службы
Для выполнения некоторых задач может потребоваться войти в систему с учетной записью «Администратор» или члена
группы «Администраторы».
Службы предоставляют такие возможности, как совместный
доступ к файлам и принтерам. Например, служба доступа к файлам и принтерам сетей Microsoft делает возможным доступ с
других компьютеров к ресурсам на данном компьютере с помощью сети Microsoft. Ниже приведена процедура добавления сетевой службы на компьютер.
Чтобы добавить на компьютер сетевую службу, выполните следующие действия.
1. Откройте «Сетевые подключения».
2. В группе ЛВС или высокоскоростной Интернет щелкните значок Подключение по локальной сети.
3. В меню Файл выберите команду Свойства.
4. В диалоговом окне Свойства: Подключение по локальной сети нажмите кнопку Установить.
5. В диалоговом окне Выбор типа сетевого компонента
выберите Служба и нажмите кнопку Добавить.
34
6. В диалоговом окне Выбор сетевой службы выберите
службу, которую требуется установить, и нажмите кнопку OK.
Чтобы добавить компьютер с Windows XP в сеть
Для выполнения этой процедуры необходимо войти в систему с учетной записью «Администратор».
1. Настройте компьютер и физически подключите его к
домашней сети или малой офисной сети.
2. Запустите мастер настройки сети.
Если в локальной сети применяется общий доступ к подключению Интернета и узловой компьютер ICS работает под
управлением Windows XP Home Edition или Windows XP
Professional, прежде всего запустите мастер настройки сети на
этом компьютере.
3. Следуйте указаниям, появляющимся на экране.
Чтобы создать подключение по локальной сети
 Если на компьютере установлен сетевой адаптер и создана домашняя или небольшая офисная сеть, значит, компьютер подключен к локальной сети. Компьютер под управлением
Windows XP Professional также подключен к локальной сети,
если он является частью корпоративной сети. При запуске компьютера операционная система обнаруживает сетевой адаптер и
автоматически начинает устанавливать подключение по локальной сети. В отличие от остальных типов подключений, подключение по локальной сети создается автоматически; для его запуска не нужно специально выбирать этот вид подключения.
Лабораторная работа № 7. Обмен данными по протоколу
TCP.
Протокол ТСР (Transport Control Protocol) – протокол управления передачей данных , является основным транспортным протоколом Сети , так как на нем основывается протокол НТТР –
базовый протокол обмена данными в WWW. Суть протокола
ТСР состоит в том, что он разбивает передаваемые данные на
блоки, снабжает каждый блок адресом назначения, его номером
и контрольной суммой, отправляет блок по сети и осуществляет
контроль за правильностью доставки. На клиентской стороне он
обеспечивает сборку отдельных блоков по их номерам (блоки
могут идти разными маршрутами и оказаться у клиента не в по-
35
рядке их отправки) и по контрольной сумме проверяет их достоверность. Если какой-то блок отсутствует или недостоверен, он
посылает запрос к серверу с требованием повторить передачу
утерянных данных.
В следующем примере клиент обращается к серверу с запросом
о передаче ему графического файла и после удовлетворения запроса отображает полученное изображение в своем компоненте
TImage.
Вначале создадим сервер: начните новый проект и поместите на
пустую форму компонент TIDTCPServer (вкладка Indy Servers
палитры компонентов). Дайте ему имя IDServ и настройте его на
работу с локальным сервером: щелкните на кнопке свойства
Bindings и в появившемся окне в списке IP Address выберите
адрес локальной машины, а в поле списка Port введите значение
8090 (предварительно полезно раскрыть этот список и убедиться, что порт не задействован другими службами вашего компьютера). После этого щелкните на кнопке Add и закройте окно
щелчком на кнопке ОК.
Характерной особенностью компонентов Indy является то, что
серверы с клиентами обмениваются данными в синхронном режиме, т.е. до завершения очередной операции обмена соответствующие оконные интерфейсные элементы (кнопки, списки и
т.п.) будут недоступны. Если обмен длится несколько мгновений, это не имеет существенного значения, но если операция
растягивается на десятки минут, клиенты и серверы кажутся зависшими. Для периодического прерывания обмена и вызова метода Application/ProcessMessages предназначениы специальные
компоненты TIDAntiFreez. Все, что нужно для подключения
компонента к работе , - это просто поместить его на форму. Хотя
в нашем примере обмен данными занимает доли секунды, тем не
менее, не будем отступать от рекомендуемых приемов: поместите на форму сервера компонент TIDAntiFreez. Активизируйте
сервер (Active = True) и напишите для события OnExecute такой
обработчик:
Procedure TForm1.IDSrvExecute(AThread: TIDPeerThread);
Var S: string;F: TFileStream;Const Path = ‘C:\program files\common
files\borland’+
‘shared\images\splash\16color\’;Begin
S:=AThread.Connection.ReadLn; // Получаем от клиента имя
файла
36
F:= TfileStream.Create(Path+s, fmOpenRead); // Создаем поток
данных
Athread.Connection.OpenWriteBuffer; // Готовим буфер записи
Athread.Connection.WriteStream(F); // Передаем поток данных
Athread.Connection.CloseWriteBuffer; // Очищаем буфер
Athread.Connection.Disconnect //Разрываем соединение
End;
Событие OnExecute возникает в момент установления связи с
клиентом. Обработчику события передается объект Athread
класса TIDPeerThread, многочисленные методы которого могут
получать от клиента или передавать ему строки, произвольные
наборы байтов, потоки данных. Вначале обработчик с помощью
метода ReadLN этого объекта получает от клиента имя графического файла и создает поток данных F для чтения файла. Затем
он готовит внутренний буфер компонента для передачи данных
потока, передает его и очищает буфер. Последнее гарантирует,
что все считанные в буфер данные будут переданы клиенту. После этого сервер разрывает связь.
Для создания клиента поместите на форму две панели, расположив первую вдоль нижнего края формы (Align = alBottom), а
вторую – на всем оставшемся пространстве (Align = alClient). На
нижнюю панель поместите компонент TComboBox (Name =
cbFile, Style = DropDownList) и наполните список свойства Items
компонента именами файлов из каталога C:\program
files\common files\borland shared\images\splash\16color (Athena.bmp, Chip.bmp, Construc.bmp, Earth.bmp, Skyline.bmp, Technlgy.bmp). Установите в свойство ItemIndex компонента значение 0. Под список разместите кнопку TButton с надписью «Получить рисунок».
На верхнюю панель поместите компонент TIDTCPClient (вкладка Indy Clients), назовите его IDCli и настройте его соединение с
сервером: в свойство Host поместите IP-адрес машины-сервера
(если клиент располагается на машине сервера, это свойство
должно содержать 127.0.0.1), а в Port – 8090. Положите на верхнюю панель компонент TImage (вкладка Additional) и установите в его свойство Align значение alClient, а в свойство Stretch
значение True. Как и в сервере, поместите на форму компонент
TIDAntiFreez.
Напишите такой обработчик щелчка на кнопке:
Procedure TForm1.Button1Click(Sender: TObject);
37
Var F: TFileStream;Begin
IDCli.Connect; // Соединяемся с сервером
IDCli.WriteLn(cbFile.Items[cbFile.ItemIndex]); // Передаем запрос
F:= TFileStream.Create(‘temp.bmp’), fmCreate); // Создаем поток
данных
IDCli.ReadStream(F, -1, True); // Читаем поток данных до конца
соединения
F.Free; // Уничтожаем поток данных (создаем файл)
Image1.Picture.LoadFromFile(‘temp.bmp’); //Показываем полученное изображение
IDCli.Disconnect; // Разрываем соединение, Уничтожаем файл
DeleteFile(‘temp.bmp’); End;
Перед запуском клиента запустите сервер IDServer.Обратите
внимание, как просто решается проблема опознавания концп
передаваемых данных: «умный» метод ReadStream читает неограниченное количество байтов (второй параметр равен -1) до
тех пор, пока есть соединение с сервером (третий параметр равен True). Как только сервер разорвет связь, метод прекращает
работу и клиент узнает, что передача данных закончилась.
И еще одно замечание. Поскольку сервер посылает клиенту данные в отдельном потоке команд, следует быть осторожным при
изменении внешнего вида сервера. Например, если бы мы захотели показывать в окне сервера количество обработанных им
запросов клиентов, мы должны были бы использовать метод
Sinchronize:
Procedure TForm1.IDSrvExecute(Athread: TIDPeerThread);Begin
…
Sinchronize(UpdateRequest) End;
Procedure UpdateRequest; Begin
FUpdate := FUpdate + 1; LebalUpdate := IntToStr(FUpdate) End.
ЛИТЕРАТУРА
1. Вишневский А. Сетевые технологии Windows 2000 для профессионалов.- СПб.:Питер, 2000.- 591 с.
2. Донецков Д.П. Вычислительные сети и телекоммуникации.
Основы сетевых технологий: Текст лекций / Д.П. Донецков,
В.Л. Алексеев. – Чебоксары: ЧГУ, 2001. – 83 с.
3.Компьютерные системы и сети: Метод. указ. / Сост. Федотов
В.Х. – Чебоксары: ЧГУ, 2001. – 15 с.
4. Компьютерные сети. Принципы, технологии, протоколы:
38
Учебник для вузов. 2-е изд. В.Г.Олифер, Н.А.Олифер. –
СПб.:Питер, 2004. – 864 с.: ил.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
WINDOWS - операционная система
Turbo Pascal, либо Borland Delphi и т.п. – система программирования; GPSS PC - среда программирования, или Matlab.
Содержание
Лабораторная работа № 1. Служебная утилита telnet.
2
Лабораторная работа № 2. Расчет конфигурации сети Ether- 6
net.
Лабораторная работа № 3. Расчёт по двум ЛВС: с шинной 22
структурой, с тактируемым доступом
Лабораторная работа № 4. Организация обработки
распределенных данных.
Лабораторная работа № 5. Исследование алгоритмов
маршрутизации сообщений
Лабораторная работа № 6. Подсистема административного
управления.
Лабораторная работа № 7. Обмен данными по протоколу
TCP.
Литература
39
26
33
34
35
26
40
Download