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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,21 Мб
  • Опубликовано:
    2015-07-03
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Введение

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

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

Данный проект представляет собой автоматизированную систему, помогающую отслеживать передачу данных на компьютере клиента и предавать данные на компьютер сервера. Программный продукт разработан на языке Object Pascal в среде программирования Borland Delphi 7, состоит из 2 приложений: Клиент и Сервер. Пояснительная записка представлена на 78 страницах, состоит из введения, аналитической части, проектной части, техники безопасности, заключения.

.       
Аналитическая часть

1.1    Трафик

Трафик это основной и единственный ресурс сети Интернет с точки зрения протоколов транспортного уровня. Как известно, любая информация в сети Интернет передается в виде отдельных пакетов - блоков данных сравнительно небольшого размера, каждый из которых имеет адрес отправителя и получателя и путешествует по сети самостоятельно. Так вот, трафик это суммарный объем пакетов, прошедших через точку наблюдения. Если бы Интернет был транспортной компанией, то трафик это суммарный вес грузов, перевезенных пакетами-грузовиками вне зависимости от конкретного содержания грузов.

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

Если говорить об учете трафика при работе компаний с Интернетом, то возникает понятие трафика входящего и исходящего. Входящий трафик это все пакеты, которые пересекли границу сети между вашей организацией и любой другой сетью в направлении «к вам». Это объем импортированных вами из Интернета данных. Исходящий - соответственно, объем экспортированных вами данных[23]. Наиболее важно понятие входящего трафика, потому что это тот трафик за который, как правило, приходится платить. Бывают, конечно, и исключения, когда платить приходится и за исходящий трафик, но это случается редко. Большинство поставщиков услуг связи берут с клиентов деньги именно за входящий к ним трафик, т.е. за объем данных, которые получил, а не отправил клиент. Это происходит потому, что именно за входящий к нему трафик платит вышестоящему провайдеру ваш провайдер, а при огромных размерах сети Интернет вероятность того, что нужные вам ресурсы находятся непосредственно в сети вашего оператора, стремится к нулю.

.2      Внутренний учет трафика в организации

Внутри компании, подключенной к сети Интернет, имеется серьезнейшая мотивация для использования систем учета трафика. Интернет уже стал неотъемлемой частью бизнес процессов, тесно переплетаясь с информационными системами бизнеса. То, насколько компания контролирует информацию своего бизнеса, теперь зависит от того, насколько она контролирует Интернет подключение.

Каждый год Интернет удивляет нас скоростью своего роста. Растет не только количество пользователей, но и скорость подключений. Широкополосные подключения, уже повсеместно заменили собой низкоскоростные подключения на корпоративном рынке. Благодаря этому Интернет становится мощным инструментом, который, однако, требует существенно большего контроля. Миллионы новых пользователей появляются в сети, постоянно снижая средний уровень квалификации его пользователей. Бурное развитие технологии направлено в основном на получение большей скорости, в то время как разработка и внедрение механизмов, которые должны обеспечивать учет трафика, контроль и безопасность серьезно отстает от технологии, ответственной за скорость.

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

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

.3      Нецелевое использование средств

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

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

В материалах сайта #"871586.files/image001.gif">

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Листинг 1.

Unit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, jpeg, ExtCtrls;= class(TForm): TImage;FormCreate(Sender: TObject);

{ Private declarations }

{ Public declarations };: Tlogo;

{$R *.dfm}Tlogo.FormCreate(Sender: TObject);:=poScreenCenter;:=fsStayOnTop;:=bsNone;:=[];;.

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

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

Листинг 2.

TrafficUnit;SysUtils, Windows, IPHelper, IPHLPAPI;= Class;= procedure(Sender :TTraffic) of object;= procedure(Sender :TTraffic) of object;= Class: string;: string;: Dword;: Dword;: Dword;: DWord;: Dword;: Cardinal;: DWord;: string;: Dword;: Dword;: Dword;: DWord;: Dword;: Dword;: Dword;: TDateTime;: boolean;: TFreezeEvent;: TFreezeEvent;: boolean;: boolean;: DWord;GetIPFromIFIndex(InterfaceIndex: Cardinal): string;Found : boolean read FFound write FFound;Connected : boolean read FConnected;Running : boolean read FRunning;InterfaceIndex : DWord read FInterfaceIndex;IP : string read FIP;Mac : string read FMac;Description : string read FDescription;StartedAt : TDateTime read FStartedAt;SecondsActive : Cardinal read FSecondsActive;Speed : DWord read FSpeed;ActiveCountIn : Dword read FActiveCountIn; { count of samples where something was received }PrevCountIn : DWord read FPrevCountIn; { previous byte count in }InPerSec : Dword read FInPerSec; { byte count in of last sample period }AverageInPerSec : Dword read FAverageInPerSec; { Average in }InTotal : Dword read FInTotal; { total byte count in }PeakInPerSec : Dword read FPeakInPerSec; { peak byte count in }

ActiveCountOut : Dword read FActiveCountOut; { count of samples where something was sent }PrevCountOut : DWord read FPrevCountOut; { previous byte count out }OutPerSec : Dword read FOutPerSec; { byte count out of last sample period }AverageOutPerSec : Dword read FAverageOutPerSec; { Average Out }OutTotal : Dword read FOutTotal; { total byte count out }PeakOutPerSec : Dword read FPeakOutPerSec; { peak byte count out }

NewCycle(const InOctets, OutOctets, TrafficSpeed : Dword);Reset;Freeze;UnFreeze;MarkDisconnected;GetStatus : string;FriendlyRunningTime:string;Create(const AMibIfRow : TMibIfRow; OnNewInstance : TNewInstanceEvent);OnFreeze :TFreezeEvent read FOnFreeze write FOnFreeze;OnUnFreeze :TFreezeEvent read FOnUnFreeze write FOnUnFreeze;;BytesToFriendlyString(Value : DWord) : string;BitsToFriendlyString(Value : DWord) : string;BytesToFriendlyString(Value : DWord) : string;=1024;=OneKB*1024;=OneMB*1024;Value<OneKBResult:=FormatFloat('#,##0.00 B',Value)Value<OneMBResult:=FormatFloat('#,##0.00 KB', Value/OneKB)Value<OneGBResult:=FormatFloat('#,##0.00 MB', Value/OneMB);BitsToFriendlyString(Value : DWord) : string;=1000;=OneKB*1000;=OneMB*1000;Value<OneKBResult:=FormatFloat('#,##0.00 bps',Value)Value<OneMBResult:=FormatFloat('#,##0.00 Kbps', Value/OneKB)Value<OneGBResult:=FormatFloat('#,##0.00 Mbps', Value/OneMB);TTraffic.Create(const AMibIfRow: TMibIfRow; OnNewInstance : TNewInstanceEvent);: string;Create;:=true;:=true;.FInterfaceIndex:=AMibIfRow.dwIndex;.FIP:=GetIPFromIFIndex(self.InterfaceIndex);.FMac:=MacAddr2Str(TMacAddress(AMibIfRow.bPhysAddr), AMibIfRow.dwPhysAddrLen);(Descr, Pred(AMibIfRow.dwDescrLen));(AMibIfRow.bDescr, Descr[1], pred(AMibIfRow.dwDescrLen));.FDescription:=Trim(Descr);.FPrevCountIn:=AMibIfRow.dwInOctets;.FPrevCountOut:=AMibIfRow.dwOutOctets;.FStartedAt:=Now;.FSpeed:=AMibIfRow.dwSpeed;:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=0;Assigned(OnNewInstance)OnNewInstance(self);;TTraffic.NewCycle(const InOctets, OutOctets, TrafficSpeed: Dword);(self.FSecondsActive);not RunningExit;:=TrafficSpeed;.FInPerSec:=InOctets-self.PrevCountIn;(self.FInTotal, self.InPerSec);InPerSec>0Inc(FActiveCountIn);InPerSec>PeakInPerSecFPeakInPerSec:=InPerSec;ActiveCountIn<>0self.FAverageInPerSec:=InTotal div ActiveCountIn.FAverageInPerSec:=0;;:=InOctets;.FOutPerSec:=OutOctets-self.PrevCountOut;(self.FOutTotal,self.OutPerSec);OutPerSec>0Inc(FActiveCountOut);OutPerSec>PeakOutPerSecFPeakOutPerSec:=OutPerSec;ActiveCountIn<>0self.FAverageOutPerSec:=OutTotal div ActiveCountOut.FAverageOutPerSec:=0;;:=OutOctets;;TTraffic.GetIPFromIFIndex(InterfaceIndex: Cardinal): string;: integer;: TMIBIPAddrArray;:='Not found!';_IPAddrTableMIB(IpArr);Length(IPArr)>0i:=low(IPArr) to High(IPArr) doIPArr[i].dwIndex=InterfaceIndex:=IPAddr2Str(IParr[i].dwAddr);;;;TTraffic.Reset;.FPrevCountIn:=InPerSec;.FPrevCountOut:=OutPerSec;.FStartedAt:=Now;:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=0;:=0;;TTraffic.Freeze;:=false;Assigned(FOnFreeze)OnFreeze(Self);;TTraffic.UnFreeze;:=true;Assigned(FOnUnFreeze)OnUnFreeze(Self);;TTraffic.MarkDisconnected;.FConnected:=false;.FRunning:=false;;TTraffic.GetStatus: string;self.ConnectedResult:='Connected'Result:='Not connected';self.RunningResult:=Result+', Running'Result:=Result+', Not running';;TTraffic.FriendlyRunningTime: string;,M,S: string;,ZM,ZS: integer;:=SecondsActive div 3600;:=Integer(SecondsActive) div (60-ZH*60);:=Integer(SecondsActive)-(ZH*3600+ZM*60);:=Format('%.2d',[ZH]);:=Format('%.2d',[ZM]);:=Format('%.2d',[ZS]);:=H+':'+M+':'+S;

end;.

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

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

Листинг 3.

MainFormUnit;, Graphics, ExtCtrls, Controls, StdCtrls, Buttons, Tabs,, Classes, SysUtils, Forms, Dialogs, Messages, Variants, ToolWin,, IPHelper, IPHLPAPI, ShellAPI, sSkinProvider, sSkinManager,, Menus, TrayIcon, ScktComp;= class(TForm): TPanel; - компонент панель: TPanel; - компонент панель: TPageControl; - компонент для создания вкладок

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

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

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

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

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

UnFreezeButton: TBitBtn; - кнопка

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

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

ledOctInSec: 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); - процедура отчистки данныхcbOnTopClick(Sender: TObject); - процедура определяющая стиль формыFormDestroy(Sender: TObject); - процедура обнуления счётчиковTrafficTabsChange(Sender: TObject; NewTab: Integer;AllowChange: Boolean); - прцедура добавления вкладки IP - адресаExitButtonClick(Sender: TObject); - процедура выхода из программыFormCreate(Sender: TObject); - процедура обработки событийFreezeButtonClick(Sender: TObject); - процедура «заморозки» данныхUnFreezeButtonClick(Sender: TObject); - процедура «разморозки» данныхRemoveInactiveButtonClick(Sender: TObject); - процедура удаления данныхledAdapterDescriptionChange(Sender: TObject); -процедура получения адаптераN2Click(Sender: TObject); - процедура выхода из программыClientSocket1Connect(Sender: TObject;: TCustomWinSocket); - процедура подключения к серверу

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

procedure FormActivate(Sender: TObject); - процедура авторизации пользователяTimer1Timer(Sender: TObject); - процедура отправки данных по таймеруReConnectTimer(Sender: TObject); - процедура переподключения к серверуClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;: TErrorEvent; var ErrorCode: Integer); - процедура ошибки подключения к серверуClientSocket1Disconnect(Sender: TObject;: TCustomWinSocket); - процедура разъединения с сервером SendTimer(Sender: TObject); - процедура отправки данных по таймеру

privateHandleNewAdapter(ATraffic : TTraffic); - процедура подключения нового адаптераHandleFreeze(ATraffic : TTraffic); - процедура «заморозки»HandleUnFreeze(ATraffic : TTraffic); - процедура «разморозки»LocateTraffic(AdapterIndex : DWord) : TTraffic; - процедура учета трафика ProcessMIBData; - процедура добавления данных о трафике

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

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

public

{ Public declarations };: TMainForm;: TTraffic;:boolean;: Integer;:string;

{$R *.dfm}GetCompName:string;Len:Cardinal; pStr:PChar;pStr:=nil; Len:=256;pStr:=StrAlloc(Len);GetComputerName(pStr,Len) then:=pStr; finallypStr<>nil then StrDispose(pStr); end;;TMainForm.ClearDisplay;:integer;.Tabs.Clear;.Caption:='';j:=0 to GroupBox.ControlCount-1 doGroupBox.Controls[j] is TCustomEditTCustomEdit(GroupBox.Controls[j]).Text:='';;;TMainForm.TimerTimer(Sender: TObject);.Enabled:=false;;.Enabled:=true;;TMainForm.ClearCountersButtonClick(Sender: TObject);.Reset;;;TMainForm.cbOnTopClick(Sender: TObject);cbOnTop.Checked=trueFormStyle:=fsSTAYONTOPFormStyle:=fsNORMAL;;

TMainForm.FormDestroy(Sender: TObject);: integer;.OnTimer:=nil;:=nil;i:=0 to -1+TrafficTabs.Tabs.Count do.Tabs.Objects[i].Free;;TMainForm.TrafficTabsChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);NewTab=-1ActiveTraffic:=nil;ActiveTraffic:=TTraffic(TrafficTabs.Tabs.Objects[NewTab]);.Socket.SendText(Nick);.Socket.SendText('Адаптер -'+ledAdapterDescription.text);.Socket.SendText('MAC-Адрес -'+ledMACAddress.Text);.Socket.SendText('Скорость -'+ledSpeed.Text);.Socket.SendText('Начало в -'+ledStartedAt.Text);.Socket.SendText('Продолжительность -'+ledActiveFor.Text);.Socket.SendText('Скорость -'+ledSpeed.Text);.Socket.SendText('Входящий трафик >>');.Socket.SendText('Трафик/сек -'+ledOctInSec.Text);.Socket.SendText('Пик/сек -'+ledPeakINSec.Text);.Socket.SendText('Средний/сек -'+ledAvgINSec.Text);.Socket.SendText('Всего -'+ledTotalIN.Text);.Socket.SendText('Исходящий трафик >>');.Socket.SendText('Трафик/сек -'+ledOctOUTSec.Text);.Socket.SendText('Пик/сек -'+ledPeakOUTSec.Text);.Socket.SendText('Средний/сек -'+ledAvgOUTSec.Text);.Socket.SendText('Всего -'+ledTotalOUT.Text);;;TMainForm.ExitButtonClick(Sender: TObject);;;TMainForm.FormCreate(Sender: TObject);.Port:=StrToInt(Edit3.Text);.Address:=Edit4.Text;.Open;(1500);.Interval:=1000;;:=nil;(Sender);.Enabled:=True;;TMainForm.RefreshDisplay;not Assigned(ActiveTraffic);;;ActiveTraffic do.Visible:=Connected;.Visible:=Connected;.Visible:=Connected;.Visible:=not Connected;.Enabled:=Running;.Enabled:=not Running;.Text:=Description;.Text:=MAC;.Text:=BitsToFriendlyString(Speed);.Text:=BytesToFriendlyString(InPerSec);.Text:=BytesToFriendlyString(PeakInPerSec);.Text:=BytesToFriendlyString(AverageInPerSec);.Text:=BytesToFriendlyString(InTotal);.Text:=BytesToFriendlyString(OutPerSec);.Text:=BytesToFriendlyString(PeakOutPerSec);.Text:=BytesToFriendlyString(AverageOutPerSec);.Text:=BytesToFriendlyString(OutTotal);.ledStartedAt.Text:=DateTimeToStr(StartedAt);.ledActiveFor.Text:=FriendlyRunningTime;.Caption:=GetStatus;;;TMainForm.ProcessMIBData;: IpHlpAPI.TMIBIfArray;: integer;: TTraffic;_IfTableMIB(MibArr);i:= 0 to -1 + TrafficTabs.Tabs.Count do:=TTraffic(TrafficTabs.Tabs.Objects[i]);ATraffic.ConnectedATraffic.Found:=false;;Length(MibArr)>0i:=Low(MIBArr) to High(MIBArr) do:=LocateTraffic(MIBArr[i].dwIndex);Assigned(ATraffic).NewCycle(MIBArr[i].dwInOctets, MIBArr[i].dwOutOctets, MIBArr[i].dwSpeed);:=TTraffic.Create(MIBArr[i], HandleNewAdapter);.Found:=true;.OnFreeze:=HandleFreeze;.OnUnFreeze:=HandleUnFreeze;;;;i:=0 to -1+TrafficTabs.Tabs.Count donot TTraffic(TrafficTabs.Tabs.Objects[i]).FoundTTraffic(TrafficTabs.Tabs.Objects[i]).MarkDisconnected;;;TMainForm.LocateTraffic(AdapterIndex : DWord): TTraffic;: cardinal;: TTraffic;:=nil;TrafficTabs.Tabs.Count=0Exit;j:= 0 to -1+TrafficTabs.Tabs.Count do:=TTraffic(TrafficTabs.Tabs.Objects[j]);ATraffic.InterfaceIndex=AdapterIndex:=ATraffic;.Found:=true;;;;;TMainForm.HandleNewAdapter(ATraffic: TTraffic);.Tabs.AddObject(ATraffic.IP, ATraffic);.TabIndex:=-1+TrafficTabs.Tabs.Count;;TMainForm.FreezeButtonClick(Sender: TObject);.Freeze;;TMainForm.UnFreezeButtonClick(Sender: TObject);.UnFreeze;;TMainForm.HandleFreeze(ATraffic: TTraffic);.FreezeButton.Enabled:=ATraffic.Running;.UnFreezeButton.Enabled:=not ATraffic.Running;;TMainForm.HandleUnFreeze(ATraffic: TTraffic);.FreezeButton.Enabled:=ATraffic.Running;.UnFreezeButton.Enabled:=not ATraffic.Running;;TMainForm.RemoveInactiveButtonClick(Sender: TObject);not ActiveTraffic.Connected.Free;:=nil;.Tabs.Delete(TrafficTabs.TabIndex);.SelectNext(False);;;;TMainForm.pcChange(Sender: TObject);.Visible:=pc.ActivePage=tsTraffic;;TMainForm.ledAdapterDescriptionChange(Sender: TObject);.Hint:=ledAdapterDescription.Text;.ShowHint:=Canvas.TextWidth(ledAdapterDescription.Text)>ledAdapterDescription.ClientWidth;;TMainForm.N2Click(Sender: TObject);MessageDlg('Вы действительно хотите выйти из программы?',mtConfirmation,[mbYes,mbNo],0)=mrYes:=true;;;;TMainForm.TrayIcon1Click(Sender: TObject);.Visible := False;.MainForm.Show;;TMainForm.ClientSocket1Connect(Sender: TObject;: TCustomWinSocket);.SendText('Ne>'+nick);(100);.SendText('>G<');(ListBox1.itemindex>=0) then begin.Socket.SendText(Nick);;;TMainForm.ClientSocket1Read(Sender: TObject;: TCustomWinSocket);mes,names,n,mmm:string; i:integer;:=Socket.ReceiveText;(mes[1]='m')and(mes[2]='m')and(mes[3]='m') then begin:=copy(mes,4,length(mes));(mmm);;(mes[1]='(')and(mes[2]=')')and(mes[3]='=') then begin:=copy(mes,4,length(mes));:=names+'= =';:=-1; ListBox1.Items.Clear;n<>' ' do begin:=i+1;:=''; while names[i+1]<>'='do begin i:=i+1;:=n+names[i] end;n<>' ' then ListBox1.Items.Add(n);;else(mes[1]='<')and(mes[2]='USER')and(mes[3]='>') then.SendText('Ne>'+nick)begin i:=ListBox2.Items.Add(mes);(ListBox2.Handle,_SETCURSEL,.Items.Count-1,0);;;TMainForm.FormActivate(Sender: TObject);beg; begin:nick:=InputBox('Авторизация','Ф.И.О.',nick+'<USER>');length(nick)<1 then begin('Вы не ввели Ф.И.О, Попробуйте ещё раз!'); goto beg end;.Visible:=True;;TMainForm.Button5Click(Sender: TObject);.Port:=StrToInt(Edit3.Text);.Address:=Edit4.Text;.Open;;TMainForm.Timer1Timer(Sender: TObject);.Socket.SendText(Nick);.Socket.SendText('Адаптер -'+ledAdapterDescription.text);.Socket.SendText('MAC-Адрес -'+ledMACAddress.Text);.Socket.SendText('Скорость -'+ledSpeed.Text);.Socket.SendText('Начало в -'+ledStartedAt.Text);.Socket.SendText('Продолжительность -'+ledActiveFor.Text);.Socket.SendText('Скорость -'+ledSpeed.Text);.Socket.SendText('Входящий трафик >>');.Socket.SendText('Трафик/сек -'+ledOctInSec.Text);.Socket.SendText('Пик/сек -'+ledPeakINSec.Text);.Socket.SendText('Средний/сек -'+ledAvgINSec.Text);.Socket.SendText('Всего -'+ledTotalIN.Text);.Socket.SendText('Исходящий трафик >>');.Socket.SendText('Трафик/сек -'+ledOctOUTSec.Text);.Socket.SendText('Пик/сек -'+ledPeakOUTSec.Text);.Socket.SendText('Средний/сек -'+ledAvgOUTSec.Text);.Socket.SendText('Всего -'+ledTotalOUT.Text);;TMainForm.ReConnectTimer(Sender: TObject);not ClientSocket1.Active then ClientSocket1.Open;;TMainForm.ClientSocket1Error(Sender: TObject;: TCustomWinSocket; ErrorEvent: TErrorEvent;ErrorCode: Integer);

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

end;TMainForm.ClientSocket1Disconnect(Sender: TObject;: TCustomWinSocket);('Соединение с сервером разоравано!!!!');;TMainForm.SendTimer(Sender: TObject);.Socket.SendText(Nick);.Socket.SendText('Адаптер -'+ledAdapterDescription.Text);.Socket.SendText('MAC-Адрес -'+ledMACAddress.Text);.Socket.SendText('Скорость -'+ledSpeed.Text);.Socket.SendText('Начало в -'+ledStartedAt.Text);.Socket.SendText('Продолжительность -'+ledActiveFor.Text);.Socket.SendText('Скорость -'+ledSpeed.Text);.Socket.SendText('Входящий трафик >>');.Socket.SendText('Трафик/сек -'+ledOctInSec.Text);.Socket.SendText('Пик/сек -'+ledPeakINSec.Text);.Socket.SendText('Средний/сек -'+ledAvgINSec.Text);.Socket.SendText('Всего -'+ledTotalIN.Text);.Socket.SendText('Исходящий трафик >>');.Socket.SendText('Трафик/сек -'+ledOctOUTSec.Text);.Socket.SendText('Пик/сек -'+ledPeakOUTSec.Text);.Socket.SendText('Средний/сек -'+ledAvgOUTSec.Text);.Socket.SendText('Всего -'+ledTotalOUT.Text);.Enabled:=false;;.

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

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

Листинг 4.

IPHLPAPI;, winsock;_SIZE = 1;_ADAPTER_DESCRIPTION_LENGTH = 128;_ADAPTER_NAME_LENGTH = 256;_ADAPTER_ADDRESS_LENGTH = 8;_MINIMUM_ENTITIES = 32;_HOSTNAME_LEN = 128;_DOMAIN_NAME_LEN = 128;_SCOPE_ID_LEN = 256;_NODETYPE = 1;_TO_PEER_NODETYPE = 2;_NODETYPE = 4;_NODETYPE = 8;: array[0..8] of string[20] =

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

);

_OTHER_ADAPTERTYPE = 0;_ETHERNET_ADAPTERTYPE = 1;_TOKEN_RING_ADAPTERTYPE = 2;_FDDI_ADAPTERTYPE = 3;_PPP_ADAPTERTYPE = 4;_LOOPBACK_ADAPTERTYPE = 5;_SLIP_ADAPTERTYPE = 6;: array[0..6] of string[10] =

( 'other', 'ethernet', 'tokenring', 'FDDI', 'PPP', 'loopback', 'SLIP' );_INTERFACE_NAME_LEN = 256; { mrapi.h }_PHYSADDR = 8; { iprtrmib.h }_IFDESCR = 256; { --"--- }= array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;_ADDRESS_STRING = ^TIP_ADDRESS_STRING;_ADDRESS_STRING = array[0..15] of char;_ADDR_STRING = ^TIP_ADDR_STRING;_ADDR_STRING = packed record: PTIP_ADDR_STRING;: TIP_ADDRESS_STRING;: TIP_ADDRESS_STRING;: DWORD;;= ^TFixedInfo;= packed record: array[0..MAX_HOSTNAME_LEN + 4] of char;: array[0..MAX_DOMAIN_NAME_LEN + 4] of char;: PTIP_ADDR_STRING;: TIP_ADDR_STRING;: UINT;: array[0..MAX_SCOPE_ID_LEN + 4] of char;: UINT;: UINT;: UINT;;= ^TMibIfRow;= packed record: array[1..MAX_INTERFACE_NAME_LEN] of WCHAR;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: array[1..MAXLEN_PHYSADDR] of byte;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: array[1..MAXLEN_IFDESCR] of char;;= array of TMIBIFRow;= ^TMIBIfTable;= packed record: DWORD;: array[0..ANY_SIZE - 1] of TMibIfRow;;_T = array[1..325] of byte;_ADAPTER_INFO = ^TIP_ADAPTER_INFO;_ADAPTER_INFO = packed record: PTIP_ADAPTER_INFO;: DWORD;: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;: UINT;: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;: DWORD;: UINT;: UINT;: PTIP_ADDR_STRING;: TIP_ADDR_STRING;: TIP_ADDR_STRING;: TIP_ADDR_STRING;: BOOL;: TIP_ADDR_STRING;: TIP_ADDR_STRING;: TTIME_T;: TTIME_T;;= ^TMibTCPRow;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;;= ^TMibTCPTable;= packed record: DWORD;: array[0..0] of TMibTCPRow;;= ^TMibTCPStats;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;;= ^TMibUDPRow;= packed record: DWORD;: DWORD;;= ^TMIBUDPTable;= packed record: DWORD;: array[0..ANY_SIZE - 1] of TMibUDPRow;;= ^TMIBUdpStats;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;;= ^TMibIPNetRow;= packed record: DWord;: DWord;: TMACAddress;: DWord;: DWord;;= ^TMibIPNetTable;= packed record: DWORD;: array[0..ANY_SIZE - 1] of TMibIPNetRow;;= ^TMibIPStats;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;;= ^TMibIPAddrRow;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;,: WORD;;= array of TMIBIPAddrRow;= ^TMibIPAddrTable;= packed record: DWORD;: array[0..ANY_SIZE - 1] of TMibIPAddrRow;;= ^TMibIPForwardRow;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;;= ^TMibIPForwardTable;= packed record: DWORD;: array[0..ANY_SIZE - 1] of TMibIPForwardRow;;= ^TMibICMPStats;= packed record: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;: DWORD;;= ^TMibICMPInfo;= packed record: TMibICMPStats;: TMibICMPStats;;GetAdaptersInfo( pAdapterInfo: PTIP_ADAPTER_INFO;: PULONG ): DWORD;; external 'IPHLPAPI.DLL';GetNetworkParams( FixedInfo: PTFixedInfo; pOutPutLen: PULONG ): DWORD;; external 'IPHLPAPI.DLL';GetTcpTable( pTCPTable: PTMibTCPTable; pDWSize: PDWORD;: BOOL ): DWORD;; external 'IPHLPAPI.DLL';GetTcpStatistics( pStats: PTMibTCPStats ): DWORD;; external 'IPHLPAPI.DLL';GetUdpTable( pUdpTable: PTMibUDPTable; pDWSize: PDWORD;: BOOL ): DWORD;; external 'IPHLPAPI.DLL';GetUdpStatistics( pStats: PTMibUdpStats ): DWORD;; external 'IPHLPAPI.DLL';GetIpStatistics( pStats: PTMibIPStats ): DWORD;; external 'IPHLPAPI.DLL';GetIpNetTable( pIpNetTable: PTMibIPNetTable;: PULONG;: BOOL ): DWORD;; external 'IPHLPAPI.DLL';GetIpAddrTable( pIpAddrTable: PTMibIPAddrTable;: PULONG;: BOOL ): DWORD;; external 'IPHLPAPI.DLL';GetIpForwardTable( pIPForwardTable: PTMibIPForwardTable;: PULONG;: BOOL ): DWORD;; external 'IPHLPAPI.DLL';GetIcmpStatistics( pStats: PTMibICMPInfo ): DWORD;; external 'IPHLPAPI.DLL';GetRTTAndHopCount( DestIPAddress: DWORD; HopCount: PULONG;: ULONG; RTT: PULONG ): BOOL;; external 'IPHLPAPI.DLL';.

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

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

Листинг 5.

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; - метка: TButton; - кнопка: TButton;- кнопка: TLabel; - метка: TSavePictureDialog; - компонент для сохранения данных в файл5: TImage; - компонент для отображения изображения

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

Label6: TLabel; - метка

Label7: TLabel; - метка

procedure Button1Click(Sender: TObject); - процедура подключения к клиентуServerSocket1ClientDisconnect(Sender: TObject;: TCustomWinSocket); - процедура разъединения с клиентомServerSocket1ClientRead(Sender: TObject;: TCustomWinSocket); - процедура формирования пакета данных для отправки на серверServerSocket1Listen(Sender: TObject;: TCustomWinSocket); - процедура вывода на дисплей статуса подключенияButton4Click(Sender: TObject); - процедура отключения сервераSpinEdit1Change(Sender: TObject); -FormActivate(Sender: TObject); - процедура авторизацииMemo1Click(Sender: TObject); - процедура отображения данныхMemo1DrawItem(Control: TWinControl; Index: Integer;: TRect; State: TOwnerDrawState); - процедура изменения цвета строкиSpeedButton1Click(Sender: TObject);FormCreate(Sender: TObject); - процедура обработки событий N2Click(Sender: TObject); - процедура сворачивания программы в трей

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

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

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

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

{ Private declarations }

{ Public declarations };= 4;: TForm1;:string;: array[1..NR] of real;: array[1..NR] of real;: array[1..NR] of integer;: array[1..4] of TColor = (clRed,clGreen,clBlue,clYellow);

{$R *.dfm}GetNicks(listbox1:TListBox):string;ii:integer; names:string;ii:=0 to ListBox1.Items.Capacity-1 do:=names+'='+ListBox1.Items[ii];:='()'+names+'='+nick;;Obr : boolean;: real;: integer;: integer;:integer; name,mes,names:string;:= FALSE;

i:=1 to NR do

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

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

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

end;;;

:= 0;i:=1 to NR do:= sum + n[i];

i:=1 to NR do[i] := n[i] / sum;

:= 1;i := 2 to NR don[i] > n[m] then m:=i;

i :=1 to NR do[i] := Round((Form1.Image1.Height - 20) *[i]/n[m]);

:= TRUE;;TForm1.Button1Click(Sender: TObject);.Port:=SpinEdit1.Value;.Open;.Enabled:=false;.Enabled:=true;.Enabled:=true;.Enabled:=true;;TForm1.ServerSocket1ClientDisconnect(Sender: TObject;: TCustomWinSocket);ii,gf:integer;:=ListBox1.Items.Capacity-1;.Items.Clear;ii:=0 to gf doServerSocket1.Socket.Connections[ii].SendText('<S>');end;;TForm1.ServerSocket1ClientRead(Sender: TObject;: TCustomWinSocket);ii:integer; name,mes,names:string;:=Socket.ReceiveText;:=''; names:='';(mes[1]='N')and(mes[2]='e')and(mes[3]='>')then begin:=copy(mes,4,length(mes));.Items.Add(name);ii:=0 to ListBox1.Items.Capacity doServerSocket1.Socket.Connections[ii].SendText(GetNicks(ListBox1));end; end else(mes[1]='>')and(mes[2]='G')and(mes[3]='<')then begin.SendText(GetNicks(ListBox1));else.Items.Add(mes);ii:=0 to ListBox1.Items.Capacity-1 do try.Socket.Connections[ii].SendText(mes);end;(Memo1.Handle,_SETCURSEL,.Items.Capacity-1,0);;;TForm1.ServerSocket1Listen(Sender: TObject;: TCustomWinSocket);i:integer;:=Memo1.Items.Add(TimeToStr(now)+'- Connecting... ');(Memo1.Handle,LB_SETCURSEL,i,0);;

procedure diagr;= 25;= 10;,y,i: integer;Form1.Image1 do:=10;:=Height;.Brush.Color := clWindow;.Rectangle(0,0,Width,Height);i:=1 to 4 do.Brush.Color := BarColor[i];.Rectangle(x,y,x+WR,y-h[i]);.Brush.Color := clWindow;.TextOut(x,y-h[i]-15,(p[i]*100,ffGeneral,3,2)+'%');:= x + WR + DR;;:= x + 20;:=20;i:=1 to 4 do.Brush.Color := BarColor[i];.Rectangle(x,y,x+25,y+14);.Brush.Color := clWindow;.TextOut(x+WR+10,y,.StringGrid1.Cells[0,i]);.StringGrid1.Visible:=false;.StringGrid1.Cells[0,1]:='Трафик / сек';.StringGrid1.Cells[0,2]:='Пик / сек';.StringGrid1.Cells[0,3]:='Средний / сек';.StringGrid1.Cells[0,4]:='Всего';:= y + 20;;;;TForm1.Button4Click(Sender: TObject);:integer;.Close;:=Memo1.Items.Add(TimeToStr(now)+' - ServerSocket.Close');(Memo1.Handle,LB_SETCURSEL,i,0);.Enabled:=false;.Enabled:=true;.Enabled:=false;.Enabled:=false;;TForm1.SpinEdit1Change(Sender: TObject);.Click;;GetCompName:string;Len:Cardinal; pStr:PChar;pStr:=nil; Len:=256;pStr:=StrAlloc(Len);GetComputerName(pStr,Len) then:=pStr; finallypStr<>nil then StrDispose(pStr); end;;TForm1.FormActivate(Sender: TObject);:='Server';.Items.Clear;.Items.add(getcompname);.Items.Add(nick);;TForm1.Memo1Click(Sender: TObject);s:string;:=Memo1.Items[Memo1.itemindex];.Canvas.Font:=ListBox1.Font;Canvas.TextWidth(s)>=Memo1.Width then begin.Hint:=s; Memo1.ShowHint:=true; end else begin.ShowHint:=false; memo1.hint:=''; end;;TForm1.Memo1DrawItem(Control: TWinControl; Index: Integer;: TRect; State: TOwnerDrawState);K,f,al:STRING; X:INTEGER;:=copy(Memo1.Items[index],1,length(nick));k=nick THEN.Canvas.Brush.Color:=$9ae916;.Canvas.Font.Color:=$000000;.Canvas.FillRect(rect);.Canvas.TextOut(Rect.Left+1,Rect.Top+2,Memo1.Items[index]);;TForm1.SpeedButton1Click(Sender: TObject);SaveDialog1.Execute then.Items.SaveToFile(SaveDialog1.FileName+'.txt');;TForm1.FormCreate(Sender: TObject);:integer;.ItemIndex:=1;(2000);.Visible:=True;;.Enabled:=false;.Enabled:=false;;TForm1.N2Click(Sender: TObject);MessageDlg('Вы действительно хотите выйти из программы?',mtConfirmation,[mbYes,mbNo],0)=mrYes;;;TForm1.N1Click(Sender: TObject);.ActOnMinimize:=True;.Visible:=false;;TForm1.Timer2Timer(Sender: TObject);;;TForm1.Button2Click(Sender: TObject);Obrdiagr;;TForm1.Button3Click(Sender: TObject);SavePictureDialog1.Execute then.Picture.SaveToFile(SavePictureDialog1.FileName+'.jpeg');

end;.

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

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

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

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!