3. Скласти пооператорну схему алгоритму (у порядку використання операторів) для програми тестування мережі (аналог – утиліта TRACERT -h).
Схема програми:
1. Підготовка до передавання пакету:
1.1 Встановлюємо час життя пакету:
TimeToLive := 1;
1.2 Запам’ятовуємо адресу вузла, що був заданий в Еdit1:
destAddr:=inet_addr(PChar(Edit1.Text));
1.3 Зчитуємо та запам’ятовуємо в змінній jump задану в Еdit2 кількість переходів:
jump:=StrToInt(Edit2.Text);
1.4 Очищуємо вікно, тобто готовимо до виведення результатів:
Memo1.Lines.Clear();
1.5 Виводимо у вікно повідомлення:
Memo1.Lines.Add('Трассировка маршруті к ['+Edit1.Text+']'+
' с максимальним числом переходів '+IntToStr(jump)+':');
2. Виконуємо передавання трьох пакетів:
2.1 Організовуємо цикл, який буде виконуватися поки час життя пакету більше вказаної кількості переходів, інакше пакет знищується:
while TimeToLive<=jump do
2.2 Відправляємо три пакети та отримуємо відповіді від вузлів, завдяки чому ми і можемо визначити текучій час життя пакету та ІР- адресу вузла:
for i:=0 to 2 do
2.2.1 Заповнюємо структуру заголовка:
IOI.Ttl:=TimeToLive; // час життя пакету
IOI.Tos:=0; // тип обслуговування, звичайно 0
IOI.Flags:=0; // прапори заголовку IP, звичайно 0
IOI.OptionsSize:=0; // розмір даних в заголовку, звичайно 0, максимум 40
IOI.OptionsData:=nil; // вказівник на дані
2.2.2 Створюємо handle:
hIP := IcmpCreateFile();
2.2.3Виділяємо пам’ять для структури pIpe:
GetMem( pIpe, sizeof(icmp_echo_reply) + sizeof(Buffer));
2.2.4 Записуємо в поле Data вміст буферу тобто дані, що повертаються:
pIpe.Data := @Buffer;
2.2.5 Зберігаємо розмір даних, що повертаються :
pIpe.DataSize := sizeof(Buffer);
2.2.6 Ініціалізація та перевірка версії Windows Sockets:
wVersionRequested := MakeWord(1,1);
error := WSAStartup(wVersionRequested,lwsaData);
if (error <> 0) then
2.2.6.1 Вивід повідомлення про помилку ініціалізації:
Memo1.SetTextBuf('Error in call to '+ 'WSAStartup().');
2.2.6.2 Код помилки
Memo1.Lines.Add('Error code: '+IntToStr(error));
2.2.7 Запам’ятовуємо час передавання пакету:
dw 310Fh
mov Timer, eax
2.2.8 Відправляємо пакет:
IcmpSendEcho(hIP,
destAddr, // адреса отримувача
@Buffer, // вказівник на дані, що посилаються
sizeof(Buffer), // розмір даних, що посилаються
@IOI, // вказівник на структуру, що посилається
pIpe, // вказівник на буфер з відповідями
sizeof(icmp_echo_reply) + sizeof(Buffer), // розмір буферу відповідей
5000); // час очікування відповіді в мс
2.2.9 Розраховуємо час передачі ввідповіді
dw 310Fh
sub eax, Timer
mov Timer, eax
2.2.10 Перевірка правильності передавання
error := GetLastError();
if (error <> 0) then
Вивід повідомлення про помилку
Memo1.SetTextBuf('Error in call to '+
'IcmpSendEcho()');
Memo1.Lines.Add('Error code: '+IntToStr(error));
2.2.11 Перевіряємо дані, що були повернені
if i=2 then
Memo1.Lines.Add(
IntToStr(TimeToLive)+' '+// початковий час життя пакета
IntToStr(Delay[0])+' '+// початковий час життя 1-го пакета
IntToStr(Delay[1])+' '+// початковий час життя 2-го пакета
IntToStr(Delay[2])+' '+// початковий час життя 3-го пакета
//визначення IP-адреси вузла
IntToStr(LoByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(LoWord(pIpe^.Address)))+'.'+
IntToStr(LoByte(HiWord(pIpe^.Address)))+'.'+
IntToStr(HiByte(HiWord(pIpe^.Address))));
2.2.12 Якщо вузел кінцевий то запам’ятовуємо його адресу і час життя пакету робимо максимальним для виходу з циклу while TimeToLive<=jump:
if destAddr=pIpe.Address
then TimeToLive:=jump;
2.3 Звільнення ресурсів
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
3. Збільшення часу життя пакету на 1
TimeToLive:=TimeToLive+1;
4. Вивід повідомлення про завершення трассировки
Memo1.Lines.Add('Трассировка завершена.');
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.