Лекция: Лекция 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 ч.