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:

  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>

Vota este post
Categories: Delphi, Ejemplos Tags: , ,
Subscribe
Notify of
guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

4 Comments
Inline Feedbacks
Ver todos los comentarios
Edgar s.
Edgar s.
14 years ago

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;
J. Young
J. Young
13 years ago

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
0
Would love your thoughts, please comment.x
()
x