Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ping [D5, Win2k]


Васек ©   (2004-01-28 13:27:00) 

Здрасти
тут понадобилось пингануть из своей проги комп в сети
Сдела как описано в статье http://delphi.mastak.ru/articles/icmp.html
Все работает, но меня нисколько пинг интересовал скока TTL.
А в
   IcmpSendEcho(hIP,
                destAddress.S_addr,
                @pingBuffer,
                sizeof(pingBuffer),
                Nil,
                pIpe,
                sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                5000);
Вместо параметров стоит NIL ... Как тока конструкцию не переделывал все равно получить TTL не могу. Подскажите как правельно нужно это оформить чтобы снять TTL.


Digitman   (2004-01-30 12:52:00) [1]

реализуй tracert
в цикле пока не достигнут целевой адрес и пока IP_SUCCESS инкрементируй ttl

по выходу из цикла, если достигнут целевой адрес и IP_SUCCESS поле ttl будет содержать интересующее тебя значение


Васек   (2004-01-30 11:26:00) [2]

Не путаю, нужно получить RTTime (что делается легко) и TTL (здесь и застрял)
Т.е. интересует 192.168.2.1 RTTime=4мс TTL=128


Digitman   (2004-01-30 11:22:00) [3]


> Васек   (30.01.04 11:11) [7]


а ты не путаешь ?
может, тебя не TTL интиресует, а RTTime ?


Васек   (2004-01-30 11:11:00) [4]

Digitman
Согласен задавать ttl=0 это ошибка IP_BAD_OPTION
Но мне нужно получить TTL с конкретного IP, а не задавать TTL самому как это предложил OlehM


Digitman   (2004-01-30 08:52:00) [5]

значит, задана некорректная опция при вызове icmpsendecho()

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

const
 IP_SUCCESS                  = 0;
 IP_STATUS_BASE              = 11000;
 IP_BUF_TOO_SMALL            = (IP_STATUS_BASE + 1);
 IP_DEST_NET_UNREACHABLE     = (IP_STATUS_BASE + 2);
 IP_DEST_HOST_UNREACHABLE    = (IP_STATUS_BASE + 3);
 IP_DEST_PROT_UNREACHABLE    = (IP_STATUS_BASE + 4);
 IP_DEST_PORT_UNREACHABLE    = (IP_STATUS_BASE + 5);
 IP_NO_RESOURCES             = (IP_STATUS_BASE + 6);
 IP_BAD_OPTION               = (IP_STATUS_BASE + 7);
 IP_HW_ERROR                 = (IP_STATUS_BASE + 8);
 IP_PACKET_TOO_BIG           = (IP_STATUS_BASE + 9);
 IP_REQ_TIMED_OUT            = (IP_STATUS_BASE + 10);
 IP_BAD_REQ                  = (IP_STATUS_BASE + 11);
 IP_BAD_ROUTE                = (IP_STATUS_BASE + 12);
 IP_TTL_EXPIRED_TRANSIT      = (IP_STATUS_BASE + 13);
 IP_TTL_EXPIRED_REASSEM      = (IP_STATUS_BASE + 14);
 IP_PARAM_PROBLEM            = (IP_STATUS_BASE + 15);
 IP_SOURCE_QUENCH            = (IP_STATUS_BASE + 16);
 IP_OPTION_TOO_BIG           = (IP_STATUS_BASE + 17);
 IP_BAD_DESTINATION          = (IP_STATUS_BASE + 18);
 IP_ADDR_DELETED             = (IP_STATUS_BASE + 19);
 IP_SPEC_MTU_CHANGE          = (IP_STATUS_BASE + 20);
 IP_MTU_CHANGE               = (IP_STATUS_BASE + 21);
 IP_GENERAL_FAILURE          = (IP_STATUS_BASE + 50);
 MAX_IP_STATUS               = IP_GENERAL_FAILURE;
 IP_PENDING                  = (IP_STATUS_BASE + 255);


Васек   (2004-01-29 21:16:00) [6]

Digitman
Выдает
>> Status: 11007

OlehM
Да работает, но тогда TTL задаю я (ttl=255), а следовательно и получаю его же (ttl=255).


OlehM   (2004-01-29 15:56:00) [7]

with ipopt do
 begin
   Ttl := 255;
   Tos := 0;
   Flags := 0;
   OptionsSize := 0;
   OptionsData := nil;
 end;

Должно заработать


Digitman   (2004-01-29 09:49:00) [8]

ты pIpe.Status проверяешь после выполнения IcmpSendEcho() ?

что говорит ?


Васек   (2004-01-28 14:42:00) [9]

Digitman
Теперь даже не пингуется ... TTL возвращается = 0


Digitman   (2004-01-28 13:56:00) [10]

вместо nil нужно указать адрес структуры  

var
 ipopt : ip_option_information;
...
       ZeroMemory(@ipopt, sizeof(ipopt)); // !!
...

         if IcmpSendEcho( hIP,
                        destAddress.S_addr,
                        @pingBuffer,
                        sizeof(pingBuffer),
                        @ipopt,
                        pIpe,
                        sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                        5000) = 0 then ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо