Автоматизированная система контроля трафика локально-вычислительной сети

Предназначение контроля и учета трафика. Нецелевое использование средств. Общая архитектура серверов контроля корпоративного Интернет доступа. Среда программирования "Delphi 7". Рабочий компьютер администратора сети. Оборудование серверного помещения.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 03.07.2015
Размер файла 1,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

В Object Pascal есть два вида подпрограмм: процедуры и функции. Функция отличается от процедуры только тем, что ее идентификатор можно наряду с константами и переменными использовать в выражениях, т. к. функция имеет выходной результат определенного типа. Если, например, определена функция

Function MyFunction: Integer;

и переменная var

X: Integer;

то возможен такой оператор присваивания:

Х := 2*MyFunction-l;

Имя процедуры нельзя использовать в выражении, т. к. процедура не имеет связанного с нею результата:

Procedure MyProcedure;

X := 2*MyProcedure-l; // Ошибка!

2.5 Типы данных

Типы в Object Pascal играют огромную роль. Связано это с тем, что лежащий в его основе язык Pascal был специально придуман как средство обучения студентов программированию. Поскольку начинающий программист легко может допустить ошибку или неточно описать свои действия, компилятор Pascal должен был иметь средства контроля за действиями программиста, чтобы вовремя предостеречь его от последствий неверных действий. Первоначально типы как раз и предназначались для того, чтобы программист явно указывал компилятору, какого размера память нужна ему в программе и что он собирается делать с этой памятью. Практика применения типов показала их высокую эффективность для защиты программы от случайных ошибок, так что практически все современные языки программирования в той или иной степени реализуют механизм типов. В Object Pascal значение типов возросло в еще большей степени, т. к. с их помощью определяются классы - основной инструмент программиста.

Свое знакомство с типами можно начать со строкового типа String. Этот тип определяет участок памяти переменной длины, каждый байт которого содержит один символ. Для символов в Object Pascal используется тип Char, таким образом, String - это цепочка следующих друг за другом символов Char. Каждый символ в String пронумерован, причем первый символ имеет номер 1. Программист может обращаться к любому символу строки, указывая его порядковый номер в квадратных скобках сразу за именем переменной:

var // Начало раздела описания переменных

S: String;

// Объявление переменной строкового типа

Begin

// Начало раздела исполняемых операторов

S := 'Строка символов';

// Переменная S содержит

// значение ”Строка символов”

S[6] := 'и'; // Теперь переменная содержит значение

// ”Строки символов”

end;

// Конец раздела исполняемых операторов

Программист обязан объявить любой вводимый им идентификатор. Идентификатор s неизвестен Delphi - он введен нами для переменной строкового типа. После его объявления в разделе переменных Delphi выделит для него начальную область памяти минимальной длины и будет контролировать использование этого идентификатора в разделе исполняемых операторов. Например, если в этом разделе встретится выражение

2*S-1

компилятор сразу забьет тревогу, так как строка не может быть участником математических вычислений: она предназначена для хранения символов, а не чисел.

В первом операторе присваивания в переменную s будет помещено значение строковой константы строка символов'. Строковые константы содержат произвольные символы, заключенные в обрамляющие апострофы, причем сами апострофы не входят в значение константы, поэтому после присваивания переменная примет значение Строка символов без апострофов (если понадобится включить в текстовую константу апостроф, он удваивается: ' символ ' ' - апостроф'). После первого присваивания s будет занимать участок памяти длиной 15 байт - по одному байту на каждый символ значения. На самом деле переменная строкового типа всегда имеет длину 4 байта, которые используются для указания на область памяти, в которой помещается сама строка символов. Переменность размера области памяти, выделяемой для размещения строки символов, - характерная особенность типа string. Если бы, например, во втором операторе мы обратились не к 6-му по счету символу, а ко всей строке в целом:

S := 'и';

эта переменная стала бы занимать 1 байт, а следующие за ним 14 байтов оказались бы свободными. Длина строковой переменной в программе меняется автоматически при каждом присваивании переменной нового значения и может составлять от 0 до 2 Гбайт[Для версии Delphi 1 тип String соответствует “короткой” строке, длина которой не может превышать 255 байт.] (1 Гигабайт (Гбайт) соответствует константе Gbyte). Над строковым типом определена операция сцепления (+):

S := 'Object'+' Pascal';// S содержит “Object Pascal” .[21].

2.6 Описание пользовательского интерфейса

От множества программ по контролю трафика, «Автоматизированную систему контроля трафика ЛВС» отличает бесплатный статус. Кроме этого, программа имеет еще одно достоинство - русскоязычный интерфейс, который способствует ее быстрому освоению. «Автоматизированная система контроля трафика ЛВС» имеет простой, интересный и понятный пользователю любого уровня интерфейс.

Программа «Автоматизированная система контроля трафика ЛВС» имеет очень быструю загрузку, совместима со всеми версиями Windows. Также программа отображает:

- Адаптер с помощью которого устройство подключено к сети.

- MAC - Адрес устройства.

- Скорость передачи данных.

- Фиксирует дату, время и продолжительность работы программы.

- Программа посчитывает входящий и исходящий трафик, определяя пик загруженности сети, среднее количество преданной/принятой информации, и её общее количество.

- Программа имеет удобные вкладки, на которых отображаются IP - Адреса.

- Программный продукт имеет функцию отображения поверх всех окон.

Функциональные возможности программы реализованы с помощью следующих режимов:

- «Заморозить» - для заморозки подключения программы.

- «Разморозить» - Для разморозки подключения.

- «Отчистить» - для обнуления всех полей программы.

- «Выход» - для выхода из программы.

Одно из основных достоинств программного продукта «Автоматизированная система контроля трафика ЛВС», это минимальные системные требования:

- Операционная система Windows 98

- Оперативная память 64 MB

- Видеокарта 32 MB

- Требуемое свободное место на жестком диске 5 MB

- Оптические устройства Клавиатура, мышь.

В данное время программа «Автоматизированная система контроля трафика ЛВС» имеет большую актуальность, в связи с распространением локальных и интернет сетей.

Данный программный продукт имеет универсальный характер применения для предприятий с Интернет - подключением или использованием локальной сети. Так же программа имеет уровень защищённости, т.е. сбои при учёте трафика невозможны или сведены к минимуму. Программа может получить большое распространение в связи с бесплатным статусом, а также имеет открытый исходный код, поэтому любой квалифицированный пользователь в состоянии адаптировать программу к ряду функций. которые имеют для него более высокий приоритет. При создании программного продукта «Автоматизированная система контроля трафика ЛВС» была использована операционная система Linux, поскольку она использует открытый исходный код позволяющий адаптировать ряд функций операционной системы под индивидуальность пользователя, в отличии от операционной системой Windows. Данный программный продукт сочетает в себе все выше перечисленные функции, воплощая в себе вариант открытой и доступной программы, рассчитанной на квалифицированного пользователя.

Приложение «Автоматизированная система контроля трафика ЛВС Client version» предназначено для контроля и учёта входящего и исходящего трафиков локальной вычислительной сети. При двойном щелчке по ярлыку программы открывается приветственное окно представленное на рисунке 1.

Рисунок 1. Приветственное окно программы

Далее открывается основная форма приложения, которая имеет 3 вкладки:

– Мониторинг трафика представленный на рисунке 2.

– Соединение представленный на рисунке 3.

– О программе представленный на рисунке 4.

Рисунок 2. Мониторинг трафика

Рисунок 3. Соединение

Рисунок 4. О программе

Приложение «Автоматизированная система контроля трафика ЛВС Server version» предназначено для приёма и сбора информации о клиентах, контроля и учёта входящего и исходящего трафика локальной вычислительной сети. При двойном щелчке по ярлыку программы открывается приветственное окно представленное на рисунке 5.

Рис 5. Приветственное окно программы

Далее открывается основная форма приложения, которая имеет 3 вкладки:

– Мониторинг, представлена на рисунке 6.

– График, представлена на рисунке 7.

– О программе, представлена на рисунке 8.

Рисунок 6. Мониторинг сети

Рисунок 7. Графическое представление трафиков

Рис 8. О программе

2.7 Описание программных модулей

2.7.1 Описание модуля Unit1

Модуль Unit1 служит для отображения приветственного окна (Листинг 1).

Листинг 1.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, jpeg, ExtCtrls;

type

Tlogo = class(TForm)

Image1: TImage;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

logo: Tlogo;

implementation

{$R *.dfm}

procedure Tlogo.FormCreate(Sender: TObject);

begin

Position:=poScreenCenter;

FormStyle:=fsStayOnTop;

BorderStyle:=bsNone;

BorderIcons:=[];

end;

end.

2.7.2 Описание модуля TrafficUnit

Модуль TrafficUnit предназначен для учёта входящего и исходящего трафиков ( Листинг 2).

Листинг 2.

unit TrafficUnit;

interface

uses SysUtils, Windows, IPHelper, IPHLPAPI;

type

TTraffic = Class;

TNewInstanceEvent = procedure(Sender :TTraffic) of object;

TFreezeEvent = procedure(Sender :TTraffic) of object;

TTraffic = Class

private

FIP: string;

FMac: string;

FInPerSec: Dword;

FInTotal: Dword;

FPeakInPerSec: Dword;

FInterfaceIndex: DWord;

FActiveCountIn: Dword;

FSecondsActive: Cardinal;

FPrevCountIn: DWord;

FDescription: string;

FOutTotal: Dword;

FPeakOutPerSec: Dword;

FOutPerSec: Dword;

FPrevCountOut: DWord;

FActiveCountOut: Dword;

FAverageInPerSec: Dword;

FAverageOutPerSec: Dword;

FStartedAt: TDateTime;

FRunning: boolean;

FOnFreeze: TFreezeEvent;

FOnUnFreeze: TFreezeEvent;

FConnected: boolean;

FFound: boolean;

FSpeed: DWord;

function GetIPFromIFIndex(InterfaceIndex: Cardinal): string;

public

property Found : boolean read FFound write FFound;

property Connected : boolean read FConnected;

property Running : boolean read FRunning;

property InterfaceIndex : DWord read FInterfaceIndex;

property IP : string read FIP;

property Mac : string read FMac;

property Description : string read FDescription;

property StartedAt : TDateTime read FStartedAt;

property SecondsActive : Cardinal read FSecondsActive;

property Speed : DWord read FSpeed;

property ActiveCountIn : Dword read FActiveCountIn; { count of samples where something was received }

property PrevCountIn : DWord read FPrevCountIn; { previous byte count in }

property InPerSec : Dword read FInPerSec; { byte count in of last sample period }

property AverageInPerSec : Dword read FAverageInPerSec; { Average in }

property InTotal : Dword read FInTotal; { total byte count in }

property PeakInPerSec : Dword read FPeakInPerSec; { peak byte count in }

property ActiveCountOut : Dword read FActiveCountOut; { count of samples where something was sent }

property PrevCountOut : DWord read FPrevCountOut; { previous byte count out }

property OutPerSec : Dword read FOutPerSec; { byte count out of last sample period }

property AverageOutPerSec : Dword read FAverageOutPerSec; { Average Out }

property OutTotal : Dword read FOutTotal; { total byte count out }

property PeakOutPerSec : Dword read FPeakOutPerSec; { peak byte count out }

procedure NewCycle(const InOctets, OutOctets, TrafficSpeed : Dword);

procedure Reset;

procedure Freeze;

procedure UnFreeze;

procedure MarkDisconnected;

function GetStatus : string;

function FriendlyRunningTime:string;

constructor Create(const AMibIfRow : TMibIfRow; OnNewInstance : TNewInstanceEvent);

published

property OnFreeze :TFreezeEvent read FOnFreeze write FOnFreeze;

property OnUnFreeze :TFreezeEvent read FOnUnFreeze write FOnUnFreeze;

end;

function BytesToFriendlyString(Value : DWord) : string;

function BitsToFriendlyString(Value : DWord) : string;

implementation

function BytesToFriendlyString(Value : DWord) : string;

const

OneKB=1024;

OneMB=OneKB*1024;

OneGB=OneMB*1024;

begin

if Value<OneKB

then Result:=FormatFloat('#,##0.00 B',Value)

else

if Value<OneMB

then Result:=FormatFloat('#,##0.00 KB', Value/OneKB)

else

if Value<OneGB

then Result:=FormatFloat('#,##0.00 MB', Value/OneMB)

end;

function BitsToFriendlyString(Value : DWord) : string;

const

OneKB=1000;

OneMB=OneKB*1000;

OneGB=OneMB*1000;

begin

if Value<OneKB

then Result:=FormatFloat('#,##0.00 bps',Value)

else

if Value<OneMB

then Result:=FormatFloat('#,##0.00 Kbps', Value/OneKB)

else

if Value<OneGB

then Result:=FormatFloat('#,##0.00 Mbps', Value/OneMB)

end;

constructor TTraffic.Create(const AMibIfRow: TMibIfRow; OnNewInstance : TNewInstanceEvent);

var

Descr: string;

begin

inherited Create;

FRunning:=true;

FConnected:=true;

self.FInterfaceIndex:=AMibIfRow.dwIndex;

self.FIP:=GetIPFromIFIndex(self.InterfaceIndex);

self.FMac:=MacAddr2Str(TMacAddress(AMibIfRow.bPhysAddr), AMibIfRow.dwPhysAddrLen);

SetLength(Descr, Pred(AMibIfRow.dwDescrLen));

Move(AMibIfRow.bDescr, Descr[1], pred(AMibIfRow.dwDescrLen));

self.FDescription:=Trim(Descr);

self.FPrevCountIn:=AMibIfRow.dwInOctets;

self.FPrevCountOut:=AMibIfRow.dwOutOctets;

self.FStartedAt:=Now;

self.FSpeed:=AMibIfRow.dwSpeed;

FActiveCountIn:=0;

FActiveCountOut:=0;

FInTotal:=0;

FOutTotal:=0;

FInPerSec:=0;

FOutPerSec:=0;

FPeakInPerSec:=0;

FPeakOutPerSec:=0;

if Assigned(OnNewInstance)

then OnNewInstance(self);

end;

procedure TTraffic.NewCycle(const InOctets, OutOctets, TrafficSpeed: Dword);

begin

inc(self.FSecondsActive);

if not Running

then Exit;

FSpeed:=TrafficSpeed;

self.FInPerSec:=InOctets-self.PrevCountIn;

Inc(self.FInTotal, self.InPerSec);

if InPerSec>0

then Inc(FActiveCountIn);

if InPerSec>PeakInPerSec

then FPeakInPerSec:=InPerSec;

try

if ActiveCountIn<>0

then self.FAverageInPerSec:=InTotal div ActiveCountIn

except

self.FAverageInPerSec:=0;

end;

FPrevCountIn:=InOctets;

self.FOutPerSec:=OutOctets-self.PrevCountOut;

Inc(self.FOutTotal,self.OutPerSec);

if OutPerSec>0

then Inc(FActiveCountOut);

if OutPerSec>PeakOutPerSec

then FPeakOutPerSec:=OutPerSec;

try

if ActiveCountIn<>0

then self.FAverageOutPerSec:=OutTotal div ActiveCountOut

except

self.FAverageOutPerSec:=0;

end;

FPrevCountOut:=OutOctets;

end;

function TTraffic.GetIPFromIFIndex(InterfaceIndex: Cardinal): string;

var

i: integer;

IPArr: TMIBIPAddrArray;

begin

Result:='Not found!';

Get_IPAddrTableMIB(IpArr);

if Length(IPArr)>0

then

for i:=low(IPArr) to High(IPArr) do

if IPArr[i].dwIndex=InterfaceIndex

then

begin

Result:=IPAddr2Str(IParr[i].dwAddr);

Break;

end;

end;

procedure TTraffic.Reset;

begin

self.FPrevCountIn:=InPerSec;

self.FPrevCountOut:=OutPerSec;

self.FStartedAt:=Now;

FSecondsActive:=0;

FActiveCountIn:=0;

FActiveCountOut:=0;

FInTotal:=0;

FOutTotal:=0;

FInPerSec:=0;

FOutPerSec:=0;

FPeakInPerSec:=0;

FPeakOutPerSec:=0;

end;

procedure TTraffic.Freeze;

begin

FRunning:=false;

if Assigned(FOnFreeze)

then OnFreeze(Self);

end;

procedure TTraffic.UnFreeze;

begin

FRunning:=true;

if Assigned(FOnUnFreeze)

then OnUnFreeze(Self);

end;

procedure TTraffic.MarkDisconnected;

begin

self.FConnected:=false;

self.FRunning:=false;

end;

function TTraffic.GetStatus: string;

begin

if self.Connected

then Result:='Connected'

else Result:='Not connected';

if self.Running

then Result:=Result+', Running'

else Result:=Result+', Not running';

end;

function TTraffic.FriendlyRunningTime: string;

var

H,M,S: string;

ZH,ZM,ZS: integer;

begin

ZH:=SecondsActive div 3600;

ZM:=Integer(SecondsActive) div (60-ZH*60);

ZS:=Integer(SecondsActive)-(ZH*3600+ZM*60);

H:=Format('%.2d',[ZH]);

M:=Format('%.2d',[ZM]);

S:=Format('%.2d',[ZS]);

Result:=H+':'+M+':'+S;

end;

end.

2.7.3 Описание модуля MainFormUnit

Модуль MainFormUnit является главной формой клиентского приложения на которой производится контроль и учёт трафика (Листинг 3).

Листинг 3.

unit MainFormUnit;

interface

uses

Windows, Graphics, ExtCtrls, Controls, StdCtrls, Buttons, Tabs,

ComCtrls, Classes, SysUtils, Forms, Dialogs, Messages, Variants, ToolWin,

TrafficUnit, IPHelper, IPHLPAPI, ShellAPI, sSkinProvider, sSkinManager,

jpeg, Menus, TrayIcon, ScktComp;

type

TMainForm = class(TForm)

pnlMain: TPanel; - компонент панель

pnlBottom: TPanel; - компонент панель

pc: TPageControl; - компонент для создания вкладок

tsTraffic: TTabSheet; - вкладка

ExitButton: TButton; - кнопка выхода

TrafficTabs: TTabSet; - компонент отображения данных

GroupBox: TGroupBox; - компонент для создания группы элементов

ledAdapterDescription: TLabeledEdit; - компонент отображения данных

UnFreezeButton: TBitBtn; - кнопка

FreezeButton: TBitBtn; - кнопка

ClearCountersButton: TBitBtn; - кнопка

ledMACAddress: TLabeledEdit; - компонент отображения данных

gbIN: TGroupBox; - компонент для создания группы элементов

ledOctInSec: TLabeledEdit; - компонент отображения данных

ledAvgINSec: TLabeledEdit; - компонент отображения данных

ledPeakINSec: TLabeledEdit; - компонент отображения данных

ledTotalIN: TLabeledEdit; - компонент отображения данных

gbOUT: TGroupBox; - компонент для создания группы элементов

ledOctOUTSec: TLabeledEdit; - компонент отображения данных

ledAvgOUTSec: TLabeledEdit; - компонент отображения данных

ledPeakOUTSec: TLabeledEdit; - компонент отображения данных

ledTotalOUT: TLabeledEdit; - компонент отображения данных

Timer: TTimer; - компонент таймер

gbTime: TGroupBox; - компонент для создания группы элементов

ledStartedAt: TLabeledEdit; - компонент отображения данных

ledActiveFor: TLabeledEdit; - компонент отображения данных

RemoveInactiveButton: TBitBtn; - кнопка

StatusText: TStaticText; - компонент отображения данных

cbOnTop: TCheckBox; - компонент включения/отключения виде флажка

ledSpeed: TLabeledEdit; - компонент отображения данных

sSkinManager1: TsSkinManager; - компонент установки скинов

sSkinProvider1: TsSkinProvider; - компонент установки скинов

TabSheet1: TTabSheet; - вкладка

Panel1: TPanel; - компонент панель

Image1: TImage; - компонент для отображения изображения

Image2: TImage; - компонент для отображения изображения

Label1: TLabel; - метка

Label2: TLabel; - метка

Panel2: TPanel; - компонент панель

TrayIcon1: TTrayIcon; - компонент сворачивания в трей

PopupMenu1: TPopupMenu; - компонент меню

N1: TMenuItem; - вкладка меню

N2: TMenuItem; - вкладка меню

ClientSocket1: TClientSocket; - компонент обмена данными

TabSheet2: TTabSheet; - вкладка

Edit4: TEdit; - компонент отображения данных

Edit3: TEdit; - компонент отображения данных

Label3: TLabel; - метка

Label4: TLabel; - метка

Timer1: TTimer; - компонент таймер

ReConnect: TTimer; - компонент таймер

Label5: TLabel; - метка

Label6: TLabel; - метка

ListBox1: TListBox; - компонент отображения данных

ListBox2: TListBox; - компонент отображения данных

Label7: TLabel; - метка

Send: TTimer; - компонент таймер

Label8: TLabel; - метка

Image3: TImage; - компонент для отображения изображения

Label9: TLabel; - метка

procedure TrayIcon1Click(Sender: TObject); - процедура сворачивания в трей

procedure TimerTimer(Sender: TObject); - процедура передачи данных в заданное время

procedure ClearCountersButtonClick(Sender: TObject); - процедура отчистки данных

procedure cbOnTopClick(Sender: TObject); - процедура определяющая стиль формы

procedure FormDestroy(Sender: TObject); - процедура обнуления счётчиков

procedure TrafficTabsChange(Sender: TObject; NewTab: Integer;

var AllowChange: Boolean); - прцедура добавления вкладки IP - адреса

procedure ExitButtonClick(Sender: TObject); - процедура выхода из программы

procedure FormCreate(Sender: TObject); - процедура обработки событий

procedure FreezeButtonClick(Sender: TObject); - процедура «заморозки» данных

procedure UnFreezeButtonClick(Sender: TObject); - процедура «разморозки» данных

procedure RemoveInactiveButtonClick(Sender: TObject); - процедура удаления данных

procedure ledAdapterDescriptionChange(Sender: TObject); -процедура получения адаптера

procedure N2Click(Sender: TObject); - процедура выхода из программы

procedure ClientSocket1Connect(Sender: TObject;

Socket: TCustomWinSocket); - процедура подключения к серверу

procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); - процедура формирования пакета данных для отправки на сервер

procedure FormActivate(Sender: TObject); - процедура авторизации пользователя

procedure Timer1Timer(Sender: TObject); - процедура отправки данных по таймеру

procedure ReConnectTimer(Sender: TObject); - процедура переподключения к серверу

procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode: Integer); - процедура ошибки подключения к серверу

procedure ClientSocket1Disconnect(Sender: TObject;

Socket: TCustomWinSocket); - процедура разъединения с сервером

procedure SendTimer(Sender: TObject); - процедура отправки данных по таймеру

private

procedure HandleNewAdapter(ATraffic : TTraffic); - процедура подключения нового адаптера

procedure HandleFreeze(ATraffic : TTraffic); - процедура «заморозки»

procedure HandleUnFreeze(ATraffic : TTraffic); - процедура «разморозки»

function LocateTraffic(AdapterIndex : DWord) : TTraffic; - процедура учета трафика

procedure ProcessMIBData; - процедура добавления данных о трафике

procedure ClearDisplay; - процедура отчистки данных

procedure RefreshDisplay; - процедура обнуления данных

public

{ Public declarations }

end;

var

MainForm: TMainForm;

ActiveTraffic : TTraffic;

CanCloseForm:boolean;

NewTab: Integer;

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 TMainForm.ClearDisplay;

var

j:integer;

begin

TrafficTabs.Tabs.Clear;

StatusText.Caption:='';

for j:=0 to GroupBox.ControlCount-1 do

begin

if GroupBox.Controls[j] is TCustomEdit

then TCustomEdit(GroupBox.Controls[j]).Text:='';

end;

end;

procedure TMainForm.TimerTimer(Sender: TObject);

begin

Timer.Enabled:=false;

ProcessMIBData;

Timer.Enabled:=true;

end;

procedure TMainForm.ClearCountersButtonClick(Sender: TObject);

begin

ActiveTraffic.Reset;

RefreshDisplay;

end;

procedure TMainForm.cbOnTopClick(Sender: TObject);

begin

if cbOnTop.Checked=true

then FormStyle:=fsSTAYONTOP

else FormStyle:=fsNORMAL;

end;

procedure TMainForm.FormDestroy(Sender: TObject);

var

i: integer;

begin

Timer.OnTimer:=nil;

ActiveTraffic:=nil;

for i:=0 to -1+TrafficTabs.Tabs.Count do

TrafficTabs.Tabs.Objects[i].Free;

end;

procedure TMainForm.TrafficTabsChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);

begin

if NewTab=-1

then

begin ActiveTraffic:=nil;

end

else ActiveTraffic:=TTraffic(TrafficTabs.Tabs.Objects[NewTab]);

ClientSocket1.Socket.SendText(Nick);

ClientSocket1.Socket.SendText('Адаптер -'+ledAdapterDescription.text);

ClientSocket1.Socket.SendText('MAC-Адрес -'+ledMACAddress.Text);

ClientSocket1.Socket.SendText('Скорость -'+ledSpeed.Text);

ClientSocket1.Socket.SendText('Начало в -'+ledStartedAt.Text);

ClientSocket1.Socket.SendText('Продолжительность -'+ledActiveFor.Text);

ClientSocket1.Socket.SendText('Скорость -'+ledSpeed.Text);

ClientSocket1.Socket.SendText('Входящий трафик >>');

ClientSocket1.Socket.SendText('Трафик/сек -'+ledOctInSec.Text);

ClientSocket1.Socket.SendText('Пик/сек -'+ledPeakINSec.Text);

ClientSocket1.Socket.SendText('Средний/сек -'+ledAvgINSec.Text);

ClientSocket1.Socket.SendText('Всего -'+ledTotalIN.Text);

ClientSocket1.Socket.SendText('Исходящий трафик >>');

ClientSocket1.Socket.SendText('Трафик/сек -'+ledOctOUTSec.Text);

ClientSocket1.Socket.SendText('Пик/сек -'+ledPeakOUTSec.Text);

ClientSocket1.Socket.SendText('Средний/сек -'+ledAvgOUTSec.Text);

ClientSocket1.Socket.SendText('Всего -'+ledTotalOUT.Text);

RefreshDisplay;

end;

procedure TMainForm.ExitButtonClick(Sender: TObject);

begin

Close;

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

ClientSocket1.Port:=StrToInt(Edit3.Text);

ClientSocket1.Address:=Edit4.Text;

ClientSocket1.Open;

Sleep(1500);

Timer.Interval:=1000;

ClearDisplay;

ActiveTraffic:=nil;

pcChange(Sender);

Timer.Enabled:=True;

end;

procedure TMainForm.RefreshDisplay;

begin

if not Assigned(ActiveTraffic)

then

begin

ClearDisplay;

Exit;

end;

with ActiveTraffic do

begin

FreezeButton.Visible:=Connected;

UnFreezeButton.Visible:=Connected;

ClearCountersButton.Visible:=Connected;

RemoveInactiveButton.Visible:=not Connected;

FreezeButton.Enabled:=Running;

UnFreezeButton.Enabled:=not Running;

ledAdapterDescription.Text:=Description;

ledMACAddress.Text:=MAC;

ledSpeed.Text:=BitsToFriendlyString(Speed);

ledOctInSec.Text:=BytesToFriendlyString(InPerSec);

ledPeakInSec.Text:=BytesToFriendlyString(PeakInPerSec);

ledAvgINSec.Text:=BytesToFriendlyString(AverageInPerSec);

ledTotalIN.Text:=BytesToFriendlyString(InTotal);

ledOctOUTSec.Text:=BytesToFriendlyString(OutPerSec);

ledPeakOUTSec.Text:=BytesToFriendlyString(PeakOutPerSec);

ledAvgOUTSec.Text:=BytesToFriendlyString(AverageOutPerSec);

ledTotalOUT.Text:=BytesToFriendlyString(OutTotal);

self.ledStartedAt.Text:=DateTimeToStr(StartedAt);

self.ledActiveFor.Text:=FriendlyRunningTime;

StatusText.Caption:=GetStatus;

end;

end;

procedure TMainForm.ProcessMIBData;

var

MibArr: IpHlpAPI.TMIBIfArray;

i: integer;

ATraffic: TTraffic;

begin

Get_IfTableMIB(MibArr);

for i:= 0 to -1 + TrafficTabs.Tabs.Count do

begin

ATraffic:=TTraffic(TrafficTabs.Tabs.Objects[i]);

if ATraffic.Connected

then ATraffic.Found:=false;

end;

if Length(MibArr)>0

then

begin

for i:=Low(MIBArr) to High(MIBArr) do

begin

ATraffic:=LocateTraffic(MIBArr[i].dwIndex);

if Assigned(ATraffic)

then

begin

ATraffic.NewCycle(MIBArr[i].dwInOctets, MIBArr[i].dwOutOctets, MIBArr[i].dwSpeed);

end

else

begin

ATraffic:=TTraffic.Create(MIBArr[i], HandleNewAdapter);

ATraffic.Found:=true;

ATraffic.OnFreeze:=HandleFreeze;

ATraffic.OnUnFreeze:=HandleUnFreeze;

end;

end;

end;

for i:=0 to -1+TrafficTabs.Tabs.Count do

if not TTraffic(TrafficTabs.Tabs.Objects[i]).Found

then TTraffic(TrafficTabs.Tabs.Objects[i]).MarkDisconnected;

RefreshDisplay;

end;

function TMainForm.LocateTraffic(AdapterIndex : DWord): TTraffic;

var

j: cardinal;

ATraffic: TTraffic;

begin

Result:=nil;

if TrafficTabs.Tabs.Count=0

then Exit;

for j:= 0 to -1+TrafficTabs.Tabs.Count do

begin

ATraffic:=TTraffic(TrafficTabs.Tabs.Objects[j]);

if ATraffic.InterfaceIndex=AdapterIndex

then

begin

Result:=ATraffic;

Result.Found:=true;

Break;

end;

end;

end;

procedure TMainForm.HandleNewAdapter(ATraffic: TTraffic);

begin

TrafficTabs.Tabs.AddObject(ATraffic.IP, ATraffic);

TrafficTabs.TabIndex:=-1+TrafficTabs.Tabs.Count;

end;

procedure TMainForm.FreezeButtonClick(Sender: TObject);

begin

ActiveTraffic.Freeze;

end;

procedure TMainForm.UnFreezeButtonClick(Sender: TObject);

begin

ActiveTraffic.UnFreeze;

end;

procedure TMainForm.HandleFreeze(ATraffic: TTraffic);

begin

self.FreezeButton.Enabled:=ATraffic.Running;

self.UnFreezeButton.Enabled:=not ATraffic.Running;

end;

procedure TMainForm.HandleUnFreeze(ATraffic: TTraffic);

begin

self.FreezeButton.Enabled:=ATraffic.Running;

self.UnFreezeButton.Enabled:=not ATraffic.Running;

end;

procedure TMainForm.RemoveInactiveButtonClick(Sender: TObject);

begin

if not ActiveTraffic.Connected

then

begin

ActiveTraffic.Free;

ActiveTraffic:=nil;

TrafficTabs.Tabs.Delete(TrafficTabs.TabIndex);

TrafficTabs.SelectNext(False);

end;

RefreshDisplay;

end;

procedure TMainForm.pcChange(Sender: TObject);

begin

pnlBottom.Visible:=pc.ActivePage=tsTraffic;

end;

procedure TMainForm.ledAdapterDescriptionChange(Sender: TObject);

begin

ledAdapterDescription.Hint:=ledAdapterDescription.Text;

ledAdapterDescription.ShowHint:=Canvas.TextWidth(ledAdapterDescription.Text)>ledAdapterDescription.ClientWidth;

end;

procedure TMainForm.N2Click(Sender: TObject);

begin

if MessageDlg('Вы действительно хотите выйти из программы?',mtConfirmation,[mbYes,mbNo],0)=mrYes

then

begin

CanCloseForm:=true;

Close;

end;

end;

procedure TMainForm.TrayIcon1Click(Sender: TObject);

begin

TrayIcon1.Visible := False;

Application.MainForm.Show;

end;

procedure TMainForm.ClientSocket1Connect(Sender: TObject;

Socket: TCustomWinSocket);

begin

Socket.SendText('Ne>'+nick);

sleep(100);

Socket.SendText('>G<');

if (ListBox1.itemindex>=0) then begin

ClientSocket1.Socket.SendText(Nick);

end;

end;

procedure TMainForm.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;

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]='USER')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 TMainForm.FormActivate(Sender: TObject);

label beg; begin

beg:nick:=InputBox('Авторизация','Ф.И.О.',nick+'<USER>');

if length(nick)<1 then begin

ShowMessage('Вы не ввели Ф.И.О, Попробуйте ещё раз!'); goto beg end;

TrayIcon1.Visible:=True;

end;

procedure TMainForm.Button5Click(Sender: TObject);

begin

ClientSocket1.Port:=StrToInt(Edit3.Text);

ClientSocket1.Address:=Edit4.Text;

ClientSocket1.Open;

end;

procedure TMainForm.Timer1Timer(Sender: TObject);

begin

ClientSocket1.Socket.SendText(Nick);

ClientSocket1.Socket.SendText('Адаптер -'+ledAdapterDescription.text);

ClientSocket1.Socket.SendText('MAC-Адрес -'+ledMACAddress.Text);

ClientSocket1.Socket.SendText('Скорость -'+ledSpeed.Text);

ClientSocket1.Socket.SendText('Начало в -'+ledStartedAt.Text);

ClientSocket1.Socket.SendText('Продолжительность -'+ledActiveFor.Text);

ClientSocket1.Socket.SendText('Скорость -'+ledSpeed.Text);

ClientSocket1.Socket.SendText('Входящий трафик >>');

ClientSocket1.Socket.SendText('Трафик/сек -'+ledOctInSec.Text);

ClientSocket1.Socket.SendText('Пик/сек -'+ledPeakINSec.Text);

ClientSocket1.Socket.SendText('Средний/сек -'+ledAvgINSec.Text);

ClientSocket1.Socket.SendText('Всего -'+ledTotalIN.Text);

ClientSocket1.Socket.SendText('Исходящий трафик >>');

ClientSocket1.Socket.SendText('Трафик/сек -'+ledOctOUTSec.Text);

ClientSocket1.Socket.SendText('Пик/сек -'+ledPeakOUTSec.Text);

ClientSocket1.Socket.SendText('Средний/сек -'+ledAvgOUTSec.Text);

ClientSocket1.Socket.SendText('Всего -'+ledTotalOUT.Text);

end;

procedure TMainForm.ReConnectTimer(Sender: TObject);

begin

if not ClientSocket1.Active then ClientSocket1.Open;

end;

procedure TMainForm.ClientSocket1Error(Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

ShowMessage('Ошибка, Не удаётся соединится с сервером!!!!');

end;

procedure TMainForm.ClientSocket1Disconnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

ShowMessage('Соединение с сервером разоравано!!!!');

end;

procedure TMainForm.SendTimer(Sender: TObject);

begin

ClientSocket1.Socket.SendText(Nick);

ClientSocket1.Socket.SendText('Адаптер -'+ledAdapterDescription.Text);

ClientSocket1.Socket.SendText('MAC-Адрес -'+ledMACAddress.Text);

ClientSocket1.Socket.SendText('Скорость -'+ledSpeed.Text);

ClientSocket1.Socket.SendText('Начало в -'+ledStartedAt.Text);

ClientSocket1.Socket.SendText('Продолжительность -'+ledActiveFor.Text);

ClientSocket1.Socket.SendText('Скорость -'+ledSpeed.Text);

ClientSocket1.Socket.SendText('Входящий трафик >>');

ClientSocket1.Socket.SendText('Трафик/сек -'+ledOctInSec.Text);

ClientSocket1.Socket.SendText('Пик/сек -'+ledPeakINSec.Text);

ClientSocket1.Socket.SendText('Средний/сек -'+ledAvgINSec.Text);

ClientSocket1.Socket.SendText('Всего -'+ledTotalIN.Text);

ClientSocket1.Socket.SendText('Исходящий трафик >>');

ClientSocket1.Socket.SendText('Трафик/сек -'+ledOctOUTSec.Text);

ClientSocket1.Socket.SendText('Пик/сек -'+ledPeakOUTSec.Text);

ClientSocket1.Socket.SendText('Средний/сек -'+ledAvgOUTSec.Text);

ClientSocket1.Socket.SendText('Всего -'+ledTotalOUT.Text);

Send.Enabled:=false;

end;

end.

2.7.4 Описание модуля IPHLPAPI

Модуль IPHLPAPI служит для определения IP - Адреса пользователя (Листинг 4).

Листинг 4.

unit IPHLPAPI;

interface

uses

Windows, winsock;

const

ANY_SIZE = 1;

MAX_ADAPTER_DESCRIPTION_LENGTH = 128;

MAX_ADAPTER_NAME_LENGTH = 256;

MAX_ADAPTER_ADDRESS_LENGTH = 8;

DEFAULT_MINIMUM_ENTITIES = 32;

MAX_HOSTNAME_LEN = 128;

MAX_DOMAIN_NAME_LEN = 128;

MAX_SCOPE_ID_LEN = 256;

BROADCAST_NODETYPE = 1;

PEER_TO_PEER_NODETYPE = 2;

MIXED_NODETYPE = 4;

HYBRID_NODETYPE = 8;

NETBIOSTypes : array[0..8] of string[20] =

( 'UNKNOWN', 'BROADCAST', 'PEER_TO_PEER', '', 'MIXED', '', '', '', 'HYBRID'

);

IF_OTHER_ADAPTERTYPE = 0;

IF_ETHERNET_ADAPTERTYPE = 1;

IF_TOKEN_RING_ADAPTERTYPE = 2;

IF_FDDI_ADAPTERTYPE = 3;

IF_PPP_ADAPTERTYPE = 4;

IF_LOOPBACK_ADAPTERTYPE = 5;

IF_SLIP_ADAPTERTYPE = 6;

AdaptTypes : array[0..6] of string[10] =

( 'other', 'ethernet', 'tokenring', 'FDDI', 'PPP', 'loopback', 'SLIP' );

MAX_INTERFACE_NAME_LEN = 256; { mrapi.h }

MAXLEN_PHYSADDR = 8; { iprtrmib.h }

MAXLEN_IFDESCR = 256; { --"--- }

type

TMacAddress = array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;

PTIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING;

TIP_ADDRESS_STRING = array[0..15] of char;

PTIP_ADDR_STRING = ^TIP_ADDR_STRING;

TIP_ADDR_STRING = packed record

Next: PTIP_ADDR_STRING;

IpAddress: TIP_ADDRESS_STRING;

IpMask: TIP_ADDRESS_STRING;

Context: DWORD;

end;

PTFixedInfo = ^TFixedInfo;

TFixedInfo = packed record

HostName: array[0..MAX_HOSTNAME_LEN + 4] of char;

DomainName: array[0..MAX_DOMAIN_NAME_LEN + 4] of char;

CurrentDNSServer: PTIP_ADDR_STRING;

DNSServerList: TIP_ADDR_STRING;

NodeType: UINT;

ScopeID: array[0..MAX_SCOPE_ID_LEN + 4] of char;

EnableRouting: UINT;

EnableProxy: UINT;

EnableDNS: UINT;

end;

PTMibIfRow = ^TMibIfRow;

TMibIfRow = packed record

wszName: array[1..MAX_INTERFACE_NAME_LEN] of WCHAR;

dwIndex: DWORD;

dwType: DWORD;

dwMTU: DWORD;

dwSpeed: DWORD;

dwPhysAddrLen: DWORD;

bPhysAddr: array[1..MAXLEN_PHYSADDR] of byte;

dwAdminStatus: DWORD;

dwOperStatus: DWORD;

dwLastChange: DWORD;

dwInOctets: DWORD;

dwInUcastPkts: DWORD;

dwInNUCastPkts: DWORD;

dwInDiscards: DWORD;

dwInErrors: DWORD;

dwInUnknownProtos: DWORD;

dwOutOctets: DWORD;

dwOutUCastPkts: DWORD;

dwOutNUCastPkts: DWORD;

dwOutDiscards: DWORD;

dwOutErrors: DWORD;

dwOutQLen: DWORD;

dwDescrLen: DWORD;

bDescr: array[1..MAXLEN_IFDESCR] of char;

end;

TMIBIfArray = array of TMIBIFRow;

PTMibIfTable = ^TMIBIfTable;

TMibIfTable = packed record

dwNumEntries: DWORD;

Table: array[0..ANY_SIZE - 1] of TMibIfRow;

end;

TTIME_T = array[1..325] of byte;

PTIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;

TIP_ADAPTER_INFO = packed record

Next: PTIP_ADAPTER_INFO;

ComboIndex: DWORD;

AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;

Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;

AddressLength: UINT;

Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;

Index: DWORD;

aType: UINT;

DHCPEnabled: UINT;

CurrentIPAddress: PTIP_ADDR_STRING;

IPAddressList: TIP_ADDR_STRING;

GatewayList: TIP_ADDR_STRING;

DHCPServer: TIP_ADDR_STRING;

HaveWINS: BOOL;

PrimaryWINSServer: TIP_ADDR_STRING;

SecondaryWINSServer: TIP_ADDR_STRING;

LeaseObtained: TTIME_T;

LeaseExpires: TTIME_T;

end;

PTMibTCPRow = ^TMibTCPRow;

TMibTCPRow = packed record

dwState: DWORD;

dwLocalAddr: DWORD;

dwLocalPort: DWORD;

dwRemoteAddr: DWORD;

dwRemotePort: DWORD;

end;

PTMibTCPTable = ^TMibTCPTable;

TMibTCPTable = packed record

dwNumEntries: DWORD;

Table: array[0..0] of TMibTCPRow;

end;

PTMibTCPStats = ^TMibTCPStats;

TMibTCPStats = packed record

dwRTOAlgorithm: DWORD;

dwRTOMin: DWORD;

dwRTOMax: DWORD;

dwMaxConn: DWORD;

dwActiveOpens: DWORD;

dwPassiveOpens: DWORD;

dwAttemptFails: DWORD;

dwEstabResets: DWORD;

dwCurrEstab: DWORD;

dwInSegs: DWORD;

dwOutSegs: DWORD;

dwRetransSegs: DWORD;

dwInErrs: DWORD;

dwOutRsts: DWORD;

dwNumConns: DWORD;

end;

PTMibUDPRow = ^TMibUDPRow;

TMibUDPRow = packed record

dwLocalAddr: DWORD;

dwLocalPort: DWORD;

end;

PTMibUDPTable = ^TMIBUDPTable;

TMIBUDPTable = packed record

dwNumEntries: DWORD;

UDPTable: array[0..ANY_SIZE - 1] of TMibUDPRow;

end;

PTMibUdpStats = ^TMIBUdpStats;

TMIBUdpStats = packed record

dwInDatagrams: DWORD;

dwNoPorts: DWORD;

dwInErrors: DWORD;

dwOutDatagrams: DWORD;

dwNumAddrs: DWORD;

end;

PTMibIPNetRow = ^TMibIPNetRow;

TMibIPNetRow = packed record

dwIndex: DWord;

dwPhysAddrLen: DWord;

bPhysAddr: TMACAddress;

dwAddr: DWord;

dwType: DWord;

end;

PTMibIPNetTable = ^TMibIPNetTable;

TMibIPNetTable = packed record

dwNumEntries: DWORD;

Table: array[0..ANY_SIZE - 1] of TMibIPNetRow;

end;

PTMibIPStats = ^TMibIPStats;

TMibIPStats = packed record

dwForwarding: DWORD;

dwDefaultTTL: DWORD;

dwInReceives: DWORD;

dwInHdrErrors: DWORD;

dwInAddrErrors: DWORD;

dwForwDatagrams: DWORD;

dwInUnknownProtos: DWORD;

dwInDiscards: DWORD;

dwInDelivers: DWORD;

dwOutRequests: DWORD;

dwRoutingDiscards: DWORD;

dwOutDiscards: DWORD;

dwOutNoRoutes: DWORD;

dwReasmTimeOut: DWORD;

dwReasmReqds: DWORD;

dwReasmOKs: DWORD;

dwReasmFails: DWORD;

dwFragOKs: DWORD;

dwFragFails: DWORD;

dwFragCreates: DWORD;

dwNumIf: DWORD;

dwNumAddr: DWORD;

dwNumRoutes: DWORD;

end;

PTMibIPAddrRow = ^TMibIPAddrRow;

TMibIPAddrRow = packed record

dwAddr: DWORD;

dwIndex: DWORD;

dwMask: DWORD;

dwBCastAddr: DWORD;

dwReasmSize: DWORD;

Unused1,

Unused2: WORD;

end;

TMibIPAddrArray = array of TMIBIPAddrRow;

PTMibIPAddrTable = ^TMibIPAddrTable;

TMibIPAddrTable = packed record

dwNumEntries: DWORD;

Table: array[0..ANY_SIZE - 1] of TMibIPAddrRow;

end;

PTMibIPForwardRow = ^TMibIPForwardRow;

TMibIPForwardRow = packed record

dwForwardDest: DWORD;

dwForwardMask: DWORD;

dwForwardPolicy: DWORD;

dwForwardNextHop: DWORD;

dwForwardIFIndex: DWORD;

dwForwardType: DWORD;

dwForwardProto: DWORD;

dwForwardAge: DWORD;

dwForwardNextHopAS: DWORD;

dwForwardMetric1: DWORD;

dwForwardMetric2: DWORD;

dwForwardMetric3: DWORD;

dwForwardMetric4: DWORD;

dwForwardMetric5: DWORD;

end;

PTMibIPForwardTable = ^TMibIPForwardTable;

TMibIPForwardTable = packed record

dwNumEntries: DWORD;

Table: array[0..ANY_SIZE - 1] of TMibIPForwardRow;

end;

PTMibICMPStats = ^TMibICMPStats;

TMibICMPStats = packed record

dwMsgs: DWORD;

dwErrors: DWORD;

dwDestUnreachs: DWORD;

dwTimeEcxcds: DWORD;

dwParmProbs: DWORD;

dwSrcQuenchs: DWORD;

dwRedirects: DWORD;

dwEchos: DWORD;

dwEchoReps: DWORD;

dwTimeStamps: DWORD;

dwTimeStampReps: DWORD;

dwAddrMasks: DWORD;

dwAddrReps: DWORD;

end;

PTMibICMPInfo = ^TMibICMPInfo;

TMibICMPInfo = packed record

InStats: TMibICMPStats;

OutStats: TMibICMPStats;

end;

function GetAdaptersInfo( pAdapterInfo: PTIP_ADAPTER_INFO;

pOutBufLen: PULONG ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetNetworkParams( FixedInfo: PTFixedInfo; pOutPutLen: PULONG ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetTcpTable( pTCPTable: PTMibTCPTable; pDWSize: PDWORD;

bOrder: BOOL ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetTcpStatistics( pStats: PTMibTCPStats ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetUdpTable( pUdpTable: PTMibUDPTable; pDWSize: PDWORD;

bOrder: BOOL ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetUdpStatistics( pStats: PTMibUdpStats ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetIpStatistics( pStats: PTMibIPStats ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetIpNetTable( pIpNetTable: PTMibIPNetTable;

pdwSize: PULONG;

bOrder: BOOL ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetIpAddrTable( pIpAddrTable: PTMibIPAddrTable;

pdwSize: PULONG;

bOrder: BOOL ): DWORD;

stdcall; external 'IPHLPAPI.DLL';

function GetIpForwardTable( pIPForwardTable: PTMibIPForwardTable;

pdwSize: PULONG;

bOrder: BOOL ): DWORD;

stdCall; external 'IPHLPAPI.DLL';

function GetIcmpStatistics( pStats: PTMibICMPInfo ): DWORD;

stdCall; external 'IPHLPAPI.DLL';

function GetRTTAndHopCount( DestIPAddress: DWORD; HopCount: PULONG;

MaxHops: ULONG; RTT: PULONG ): BOOL;

stdCall; external 'IPHLPAPI.DLL';

implementation

end.

2.7.5 Описание модуля ServerUnit1

Модуль ServerUnit1 является главной формой в серверной части приложения, служит для получения информации от клиентской части приложения и отображения ее (Листинг 5).

Листинг 5.

unit ServerUnit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ScktComp, ExtCtrls, Buttons, Spin, ToolWin, ComCtrls,

sSkinProvider, sSkinManager, Menus, TrayIcon, TeeProcs, TeEngine, Chart,

jpeg, ExtDlgs, Grids;

type

TForm1 = class(TForm)

ServerSocket1: TServerSocket; - компонент обмена данными

Label1: TLabel; - метка

Button1: TButton; - кнопка

SpinEdit1: TSpinEdit; - окно для ввода данных

Button4: TButton; - кнопка

SpeedButton1: TSpeedButton; - кнопка

SaveDialog1: TSaveDialog;- компонент для сохранения данных в файл

PageControl1: TPageControl; - компонент для создания в кладок

TabSheet1: TTabSheet; - вкладка

Memo1: TListBox; - компонент отображения данных

ListBox1: TListBox; - компонент для отображения данных

sSkinManager1: TsSkinManager; - компонент для установки скинов

sSkinProvider1: TsSkinProvider; - компонент для установки скинов

TabSheet2: TTabSheet; - вкладка

TrayIcon1: TTrayIcon; - компонент для сворачивания в трей

PopupMenu1: TPopupMenu;- компонент меню

N1: TMenuItem; - вкладка меню

N2: TMenuItem; - вкладка меню

Timer1: TTimer; - компонент таймер

TabSheet3: TTabSheet; - вкладка

Image1: TImage; - компонент для отображения изображения

Timer2: TTimer; - компонент таймер

Panel1: TPanel; - компонент панель

Image2: TImage; - компонент для отображения изображения

Image3: TImage; - компонент для отображения изображения

Label2: TLabel; - метка

Label3: TLabel; - метка

Label4: TLabel; - метка

Button2: TButton; - кнопка

Button3: TButton;- кнопка

Label5: TLabel; - метка

SavePictureDialog1: TSavePictureDialog; - компонент для сохранения данных в файл

Image5: TImage; - компонент для отображения изображения

StringGrid1: TStringGrid; - компонент для отображения данных

Label6: TLabel; - метка

Label7: TLabel; - метка

procedure Button1Click(Sender: TObject); - процедура подключения к клиенту

procedure ServerSocket1ClientDisconnect(Sender: TObject;

Socket: TCustomWinSocket); - процедура разъединения с клиентом

procedure ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket); - процедура формирования пакета данных для отправки на сервер

procedure ServerSocket1Listen(Sender: TObject;

Socket: TCustomWinSocket); - процедура вывода на дисплей статуса подключения

procedure Button4Click(Sender: TObject); - процедура отключения сервера

procedure SpinEdit1Change(Sender: TObject); -

procedure FormActivate(Sender: TObject); - процедура авторизации

procedure Memo1Click(Sender: TObject); - процедура отображения данных

procedure Memo1DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState); - процедура изменения цвета строки

procedure SpeedButton1Click(Sender: TObject);

procedure FormCreate(Sender: TObject); - процедура обработки событий

procedure N2Click(Sender: TObject); - процедура сворачивания программы в трей

procedure N1Click(Sender: TObject); - процедура разворачивания программы из трея

procedure Timer2Timer(Sender: TObject); - процедура отображения данных по таймеру

procedure Button2Click(Sender: TObject); - процедура отображения графика

procedure Button3Click(Sender: TObject); - процедура сохранения графика

private

{ Private declarations }

public

{ Public declarations }

end;

const

NR = 4;

var

Form1: TForm1;

Nick:string;

n: array[1..NR] of real;

p: array[1..NR] of real;

h: array[1..NR] of integer;

BarColor: array[1..4] of TColor = (clRed,clGreen,clBlue,clYellow);

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;

function Obr : boolean;

var

sum: real;

m: integer;

i: integer;

ii:integer; name,mes,names:string;

begin

obr := FALSE;

for i:=1 to NR do

begin

try

n[i]:=Form1.Memo1.Items.Add(mes);

except

on EConvertError do

begin

ShowMessage('Надо ввести данные во все' + #13 +

'ячейки второй колонки.');

exit;

end;

end;

end;

sum := 0;

for i:=1 to NR do

sum := sum + n[i];

for i:=1 to NR do

p[i] := n[i] / sum;

m := 1;

for i := 2 to NR do

if n[i] > n[m] then m:=i;

for i :=1 to NR do

h[i] := Round((Form1.Image1.Height - 20) *

n[i]/n[m]);

obr := TRUE;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

ServerSocket1.Port:=SpinEdit1.Value;

ServerSocket1.Open;

Button1.Enabled:=false;

Button4.Enabled:=true;

button2.Enabled:=true;

button3.Enabled:=true;

end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;

Socket: TCustomWinSocket);

var ii,gf:integer;

begin

gf:=ListBox1.Items.Capacity-1;

ListBox1.Items.Clear;

for ii:=0 to gf do

try ServerSocket1.Socket.Connections[ii].SendText('<S>');

except end;

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)+'- Connecting... ');

SendMessage(Memo1.Handle,LB_SETCURSEL,i,0);

end;

procedure diagr;

const

WR = 25;

DR = 10;

var

x,y,i: integer;

begin

with Form1.Image1 do

begin

x:=10;

y:=Height;

Canvas.Brush.Color := clWindow;

Canvas.Rectangle(0,0,Width,Height);

for i:=1 to 4 do

begin

Canvas.Brush.Color := BarColor[i];

Canvas.Rectangle(x,y,x+WR,y-h[i]);

Canvas.Brush.Color := clWindow;

Canvas.TextOut(x,y-h[i]-15,

FloatToStrF(p[i]*100,ffGeneral,3,2)+'%');

x := x + WR + DR;

end;

x := x + 20;

y:=20;

for i:=1 to 4 do

begin

Canvas.Brush.Color := BarColor[i];

Canvas.Rectangle(x,y,x+25,y+14);

Canvas.Brush.Color := clWindow;

Canvas.TextOut(x+WR+10,y,

Form1.StringGrid1.Cells[0,i]);

Form1.StringGrid1.Visible:=false;

Form1.StringGrid1.Cells[0,1]:='Трафик / сек';

Form1.StringGrid1.Cells[0,2]:='Пик / сек';

Form1.StringGrid1.Cells[0,3]:='Средний / сек';

Form1.StringGrid1.Cells[0,4]:='Всего';

y := y + 20;

end;

end;

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;

button2.Enabled:=false;

button3.Enabled:=false;

end;

procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

Button4.Click;

end;

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.FormActivate(Sender: TObject);

begin

nick:='Server';

Memo1.Items.Clear;

Memo1.Items.add(getcompname);

Memo1.Items.Add(nick);

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.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:=$9ae916;

Memo1.Canvas.Font.Color:=$000000;

Memo1.Canvas.FillRect(rect);

Memo1.Canvas.TextOut(Rect.Left+1,Rect.Top+2,Memo1.Items[index]);

End;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

if SaveDialog1.Execute then

Memo1.Items.SaveToFile(SaveDialog1.FileName+'.txt');

end;

procedure TForm1.FormCreate(Sender: TObject);

var

i:integer;

begin

ListBox1.ItemIndex:=1;

Sleep(2000);

TrayIcon1.Visible:=True;

diagr;

button2.Enabled:=false;

button3.Enabled:=false;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

if MessageDlg('Вы действительно хотите выйти из программы?',mtConfirmation,[mbYes,mbNo],0)=mrYes

then

begin

Close;

end;

end;

procedure TForm1.N1Click(Sender: TObject);

begin

TrayIcon1.ActOnMinimize:=True;

TrayIcon1.Visible:=false;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

begin

diagr;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

if Obr

then diagr;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

if SavePictureDialog1.Execute then

Image1.Picture.SaveToFile(SavePictureDialog1.FileName+'.jpeg');

end;

End.

3. Рекомендации по охране труда, технике безопасности и охране окружающей среды

3.1 Рабочее место администратора локальной сети

Несмотря на то, что сеть может охватывать значительную площадь и войти в нее (авторизоваться) можно с любого подключенного к ней компьютера, рабочее место администратора сети должно быть по возможности ближе к основному серверу сети. Размещение рабочего места в непосредственной близости к серверу избавит от излишней ходьбы, если необходимо срочно предпринять какие-либо меры. Как бы надежно ни было оборудование и программное обеспечение, ни для кого не секрет, что всегда возможно "зависание" системы или отдельной программы. В этом случае даже наличие специальных средств удаленного управления не позволит оперативно решить проблему. Необходимо личное присутствие администратора около сервера. При этом рабочее место администратора сети, точнее рабочий компьютер, не должен совпадать с компьютером-сервером. Несмотря на высокий уровень подготовки, никто не застрахован от ошибок. А ошибка, допущенная при работе на сервере, может стать причиной простоя сети в течение продолжительного времени. Конечно, полностью исключить необходимость выключения или перезагрузки сервера невозможно, но время проведения этих операций и их количество должно быть минимизировано.

Наиболее удобный вариант расположения рабочего места -- это "серверная" (отдельное помещение, где расположен сервер или серверы). Само собой разумеется, что от компьютеров сети, коммутаторов, расположенных в сети, от других сетей, возможно, взаимодействующих с серверной подходит значительное число кабелей. Часто начинающие администраторы считают, что когда возникнет необходимость, можно изменить подключения, переложить кабели, заменить оборудование. На самом деле, если заранее не предусмотреть возможности расширения сети, наступит момент, когда она будет неработоспособна продолжительное время, которое может составлять не один день; даже после восстановления ее работоспособности придется завершать начатые работы не одну неделю. Лучше заранее готовиться к будущим проблемам. Естественно, что такая подготовка потребует некоторых затрат, которые на данный момент "не требуются", но эти затраты необходимы. Если выделение средств на техническое обеспечение сети зависит от руководства организации, в которой эксплуатируется сеть, необходимо доказать, что затраты необходимы именно теперь.

Позднее затраты будут выше, учитывая потери, к которым приведет продолжительный простой сети, а также оплату за работу, которая будет выполняться.

Немаловажен организованный монтаж кабеля, содержания его, и сетевого оборудования в специальных шкафах. При этом значительно уменьшается вероятность случайного доступа к кабелям и оборудованию, находящемуся в шкафу. Возле каждого гнезда на патч-панелях должны быть этикетки с подписями о назначении данного соединения. Неплохо иметь и список всех гнезд с указанием их назначения.


Подобные документы

  • Разработка структуры локально-вычислительной сети ГБОУ СПО "ВПТ". Обоснование топологии, выбор аппаратного обеспечения для коммутации и сегментации. Установка и настройка сетевых протоколов и служб. Система мониторинга сетевых узлов и сетевого трафика.

    дипломная работа [1,8 M], добавлен 25.10.2013

  • Настройка списка контроля доступа для компьютерной сети, выходящей в интернет через прокси-сервер Squid. Использование и типы прокси-серверов, описание их архитектуры. Списки контроля доступа, идентификация, настройка конфигурации и запуск серверов.

    курсовая работа [1,3 M], добавлен 26.08.2010

  • Анализ работы программы "Traffic Inspector", предназначенной для автоматизации учета интернет-трафика. Рассмотрение задач биллинговой системы: тарификации предоставляемых услуг; управления балансом пользователя; детализации личного счёта абонента.

    курсовая работа [4,0 M], добавлен 03.07.2012

  • Выбор спецификации активного и пассивного сетевого оборудования локальной вычислительной сети. Расчет количества кабеля и кабель-каналов. Выбор операционной системы рабочих станций. Настройка серверного, активного сетевого и серверного оборудования.

    курсовая работа [2,5 M], добавлен 18.05.2021

  • Разработка мультисервисной вычислительной сети с целью предоставления услуг доступа к сети Интернет и просмотру IP-телевидения жильцам микрорайона поселка городского типа Струги Красные. Этапы внедрения локально-вычислительной сети, выбор компонентов.

    дипломная работа [2,7 M], добавлен 19.06.2012

  • Анализ технологий, применяемых для построения современных ЛВС. Моделирование функционирования локальной вычислительной сети по технологии Fast Ethernet. Разработка клиент-серверного приложения и программного обеспечения, работающего в сети APMов.

    курсовая работа [2,0 M], добавлен 23.11.2011

  • Проект локальной вычислительной сети Еthеrnеt как основы комплекса технических средств информационной системы. Структура, способ использования глобальной вычислительной сети, перечень услуг для информационной системы. Состав серверов, выход в Интернет.

    курсовая работа [1,5 M], добавлен 05.11.2012

  • Определение логической и физической структуры предприятия. Реализация локальной вычислительной сети, согласно, построенной схемы и модели. Моделирование сети в Cisco Packet Tracer. Обеспечение доступа к Интернету. Установка и настройка серверов.

    курсовая работа [3,8 M], добавлен 22.05.2019

  • Разработка структурной схемы компьютерной сети. Планирование топологии сети, настройка серверов. Принципы распределения IP-адресов. Расчет удвоенной задержки распространения сигнала. Моделирование потоков трафика в сети. Сетевые протоколы, их особенности.

    курсовая работа [1,2 M], добавлен 23.12.2015

  • Назначение и специфика работы вычислительной сети. Организация локально-вычислительной сети офисов Москва City. Глобальная компьютерная сеть. Топология вычислительной сети. Основные типы кабелей. Повторители и концентраторы. Планирование сети с хабом.

    курсовая работа [228,5 K], добавлен 08.01.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.