Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Братья и сетры подскажите по Icmp.dll


Автор: GoingOnward 19.4.2007, 03:54
Код

procedure ;
var
    hIP : THandle;
    pingBuffer : array of char;
    pIpe : ^icmp_echo_reply;
    pHostEn : PHostEnt;
    wVersionRequested : WORD;
    lwsaData : WSAData;
    error : DWORD;
    destAddress : In_Addr;
begin
   SetLength(pingBuffer,PackSize );
Try
    If Assigned(parent.FOnStart) Then parent.FOnStart(parent);
    parent.FIP := '';
    hIP := IcmpCreateFile();
    GetMem( pIpe, sizeof(icmp_echo_reply) + sizeof(pingBuffer));
    pIpe.Data := @pingBuffer;
    pIpe.DataSize := sizeof(pingBuffer);
    pIpe.Options.Ttl := parent.FTTL;

    wVersionRequested := MakeWord(1,1);
    error := WSAStartup(wVersionRequested,lwsaData);
    if (error <> 0) then
    begin
         parent.AddS('Ошибка при выполнении Ping : '+InttoStr(error));
         Exit;
    end;

    pHostEn := gethostbyname(pchar(parent.fHost));
    error := GetLastError();
    if (error <> 0) then
    begin
         parent.AddS('Ошибка при выполнении Ping : '+InttoStr(error));
         Exit;
    end;

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

    parent.FIP := inet_ntoa(destAddress);
    IcmpSendEcho(hIP,
                 destAddress.S_addr,
                 pingBuffer,
                 sizeof(pingBuffer),
                 Nil,
                 pIpe,
                 sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                 parent.FTimeOut);

error := GetLastError();
if (error <> 0) then
begin
parent.AddS('Ошибка при выполнении Ping : '+InttoStr(error));
Exit;
end;

IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
If Not Terminated Then
Pointer(parent.FPingThread) := Nil;
If Assigned(parent.FOnEnd) Then parent.FOnEnd(parent);
except
ShowMessage('Ошибка процедуры Execute!');
end;
end;


У меня одна трудная проблема, код я смог написать а вот проблему не решил :
В самом начале есть такая переменная - pingBuffer : array of char;
она служит для передачи инфы Рамера пакета для пинга.
В этом и есть проблема если я укажу так pingBuffer : array[0..19] of char;
то размер пакета будет 20 байт.
Вот собствено и проблема как мне указать на размер пакета из переменной
например есть переменная PackSize ??
Я пробывал SetLength(pingBuffer,PackSize );
не как вообще не идёт,IcmpSendEcho считает его за 0-е составляющие..
Вот и всё.
Можно ещё и так задать - как в этом коде можно указать чтоб размер пакета брлся из переменной PackSize : Integer;
Это вопрос думаю сложный так что нужен гуру как я ...... ахахахха

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)