Inicio > Delphi, Ejemplos > PING “threaded” usando ICMP.DLL

PING “threaded” usando ICMP.DLL

miércoles, 16 de diciembre de 2009 Dejar un comentario Ir a comentarios
Share Button

Hay muchas formas de implementar un PING. Una de ellas es utilizando la librería ICMP.DLL (Internet Control Message Protocol).
Basándome en la Unit Ping.pas que utiliza esta librería extraída de delphi-Central, he creado un ejemplo que la utiliza combinando las llamadas con Threads.

La unit Ping.pas se puede descargar desde la página anterior o desde aquí (raw_ping). El ejemplo crea una clase llamada TPingThread con la siguiente estructura:

0
1
2
3
4
5
6
7
8
9
10
  TPingThread = class(TThread)
  private
    mmResult:TMemo;
  protected
    procedure Execute; override;
    procedure UpdateResult;
  public
    PingResult:TPingResult;
    Ready:Boolean;
    constructor Create(Ping:TPingResult);
  end;

En este caso hemos añadido un TMemo para poder usarlo en la sincronización y mostrar los resultados, aunque no seía necesario (sólo para mostrarlos en este ejemplo), ya que los resultados realmente se alamacenan en la variable PingResult.

El thread utiliza el procedimiento IcmpSendEcho para realiza el Ping.

Se puede descargar el código fuente y los binarios compilados con Delphi 6:
<CODIGO FUENTE>
<BINARIO>

Se puede comparar este con un ejemplo similar realizado sin threads.
<DESCARGAR BINARIO>

Share Button
Categories: Delphi, Ejemplos Tags: , ,
  1. Edgar s.
    viernes, 23 de julio de 2010 a las 18:59 | #1

    He modificado tu ejemplo para delphi 2010 y me funciono bien. Lo queria publicar aqui pero la verdad no se si se pueda.

    solo cambie este procedimiento (las variables String y char por ansiString y AnsiChar)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    procedure TranslateStringToTInAddr(AIP: Ansistring; 
                                        var AInAddr);
    var
      phe: PHostEnt;
      pac: PAnsiChar;
      GInitData: TWSAData;
    begin
      WSAStartup($101, GInitData);
      try
        phe := GetHostByName(pansichar(AIP));
        if Assigned(phe) then
        begin
          pac :=PAnsichar( phe^.h_addr_list^);
          if Assigned(pac) then
          begin
            with TIPAddr(AInAddr).S_un_b do begin
              s_b1 := Byte(pac[0]);
              s_b2 := Byte(pac[1]);
              s_b3 := Byte(pac[2]);
              s_b4 := Byte(pac[3]);
            end;
          end
          else
          begin
            raise Exception.Create(
                    'Error obteniendo la IP del Host');
          end;
        end
        else
        begin
          raise Exception.Create('Error obteniendo el Host');
        end;
      except
        FillChar(AInAddr, SizeOf(AInAddr), #0);
      end;
      WSACleanup;
    end;
  2. Neftalí
    lunes, 26 de julio de 2010 a las 09:14 | #2

    Hola Edgar.
    Muchas gracias por el comentario y la publicación (que por supuesto puedes hacer). Me he permitido añadir Tag’s al texto para que te reconozca el código y lo pinte como tal.

    Un saludo.

  3. J. Young
    jueves, 25 de agosto de 2011 a las 16:07 | #3

    Hola, he probado el ejemplo compilado con Delphi XE bajo Windows 7 Pro 32 bit y no he logrado que funcione correctamente, ¿alguna idea al respecto o será compatibilidad?

    Gracias.

  4. Neftalí
    domingo, 28 de agosto de 2011 a las 09:18 | #4

    @J. Young
    Hola.

    Pues no lo he probado, pero habría que saber qué error te está dando.

    Un saludo.

  1. Sin trackbacks aún.
What is 11 + 5 ?
Please leave these two fields as-is:
IMPORTANTE! Para continuar, debes contestar la pregunta anterior (para evitar SPAM) :-)