Лекция: Лекция 1-2: Базовые понятия ИИ

Программа тестирования сети программой типа утилита PING –a.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, StdCtrls, Classes, Graphics, Controls, Forms, Dialogs, WinSock;

type

TForm1 = class(TForm)

Button1: TButton;

Edit1: TEdit;

memo1: TMemo;

Label1: TLabel;

Label2: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

type

ip_option_information = packed record // Информация заголовка IP

Ttl: byte; // Время жизни

Tos: byte; // Тип обслуживания, обычно 0

Flags: byte; // Флаги заголовка IP, обычно 0

OptionsSize: byte; // Размер данных в заголовке, обычно 0, максимум 40

OptionsData: Pointer; // Указатель на данные

end;

 

icmp_echo_reply = packed record

Address: u_long; // Адрес отвечающего

Status: u_long; // IP_STATUS

RTTime: u_long; // Время между эхо-запросом и эхо-ответом

// в миллисекундах

DataSize: u_short; // Размер возвращенных данных

Reserved: u_short; // Зарезервировано

Data: Pointer; // Указатель на возвращенные данные

Options: ip_option_information; // Информация из заголовка IP

end;

 

PIPINFO = ^ip_option_information;

PVOID = Pointer;

function IcmpCreateFile(): THandle; stdcall; external 'ICMP.DLL' name 'IcmpCreateFile';

 

function IcmpCloseHandle(IcmpHandle: THandle): BOOL; stdcall; external 'ICMP.DLL' name 'IcmpCloseHandle';

 

function IcmpSendEcho(

IcmpHandle: THandle; // handle, возвращенный IcmpCreateFile()

DestAddress: u_long; // Адрес получателя (в сетевом порядке)

RequestData: PVOID; // Указатель на посылаемые данные

RequestSize: Word; // Размер посылаемых данных

RequestOptns: PIPINFO; // Указатель на посылаемую структуру

// ip_option_information (может быть nil)

ReplyBuffer: PVOID; // Указатель на буфер, содержащий ответы.

ReplySize: DWORD; // Размер буфера ответов

Timeout: DWORD // Время ожидания ответа в миллисекундах

): DWORD; stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

hIP: THandle;

pingBuffer: array [0..31] of Char;

pIpe: ^icmp_echo_reply;

pHostEn: PHostEnt;

wVersionRequested: WORD;

lwsaData: WSAData;

error: DWORD;

destAddress: In_Addr;

s: pchar;

IP: ip_option_information;

iteration: byte;

ii, ping_yes, ping_no: byte;

begin

Memo1.Clear;

ping_yes:=0;

ping_no:=0;

// Создание соеденения для работы

hIP := IcmpCreateFile();

//выделение памяти

GetMem(pIpe,sizeof(icmp_echo_reply) + sizeof(pingBuffer));

pIpe.Data := @pingBuffer;

pIpe.DataSize := sizeof(pingBuffer);

//получение версии интерфейса Windows Sockets

wVersionRequested := MakeWord(1,1);

//инициализация интерфейса Windows Sockets

//с возращением кода ошибки

error := WSAStartup(wVersionRequested,lwsaData);

if (error <> 0) then

begin

Memo1.SetTextBuf('Ошибка вызова функции '+'WSAStartup');

Memo1.Lines.Add('Код ошибки: '+IntToStr(error));

Exit;

end;

s := pchar(edit1.Text);

//возвращение адреса IP

pHostEn := gethostbyname(s);

//определение ошибки

error := GetLastError();

if (error <> 0) then

begin

Memo1.SetTextBuf('Неизвестный адрес');

Exit;

end;

//получение адреса IP по имени хоста

destAddress := PInAddr(pHostEn^.h_addr_list^)^;

// Посылаем ping-пакет

//inet_ntoa() — преобразование адреса IP в текстовую строку

Memo1.Lines.Add('Обмен пакетами с '+pHostEn^.h_name+' ['+inet_ntoa(destAddress)+'] '+' по '+IntToStr(sizeof(pingBuffer))+' байт:');

Memo1.Lines.Add('');

with IP do // Заполнение заголовка

begin

Ttl := 128;

Tos := 0;

Flags := 0;

OptionsSize := 0;

OptionsData := nil;

end;

for ii:=1 to 4 do begin

//посылка через установленное соеденение соответствующих данных

IcmpSendEcho(hIP,destAddress.S_addr,@pingBuffer,sizeof(pingBuffer),@IP,pIpe,sizeof(icmp_echo_reply)+sizeof(pingBuffer),5000);

//получение кода ошибки посылки-приема

error := GetLastError();

if (error <> 0) then

begin

case error of

11010: s:='Превышен интервал ожидания для запроса';

11003: s:='Заданный узел недоступен';

11018: s:='Указан неправильный адрес';

else s:='error';

end;

Memo1.Lines.Add(s);

inc(ping_no);

end

else

begin

inc(ping_yes);

// Смотрим некоторые из вернувшихся данных

Memo1.Lines.Add('Ответ от '+

IntToStr(LoByte(LoWord(pIpe^.Address)))+'.'+

IntToStr(HiByte(LoWord(pIpe^.Address)))+'.'+

IntToStr(LoByte(HiWord(pIpe^.Address)))+'.'+

IntToStr(HiByte(HiWord(pIpe^.Address)))+': '+' число байт='+IntToStr(pIpe.DataSize)+' время='+IntToStr(Result{pIpe.RTTime})+'мс '+' TTL='+IntToStr(IP.TTL));

end;

end;

Memo1.Lines.Add('');

Memo1.Lines.Add('Пакетов послано='+IntToStr(ping_yes+ping_no)+' получено='+IntToStr(ping_yes)+' потеряно='+IntToStr(ping_no)+' ('+IntToStr(100-round(100*(1-ping_no/(ping_no+ping_yes))))+'% потерь)');

//закрытие соеденения

IcmpCloseHandle(hIP);

//освобождение ресурсов, полученых у ОС для работы с WinSockets

WSACleanup();

//освобождение памяти выделеной для

FreeMem(pIpe);

end;

end.

 

Результаты работы:

 

Лекция 1-2: Базовые понятия ИИ

Терминология. Философские аспекты проблемы систем ИИ (возможность существования, безопасность, полезность). История развития систем ИИ.

Лекционные занятия — 4 ч.

еще рефераты
Еще работы по истории