Розробка системи діагностики мережі (аналог - утиліта TRACERT), страница 3

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('Трассировка завершена.');