Rede - ping sem usar componentes

Top  Previous  Next

// sem usar componentes...

unit ping;

 

interface

 

uses

  Windows, SysUtils, Classes;

 

type

  TSunB = packed record

    s_b1, s_b2, s_b3, s_b4: byte;

  end;

 

  TSunW = packed record

    s_w1, s_w2: word;

  end;

 

  PIPAddr = ^TIPAddr;

  TIPAddr = record

    case integer of

      0: (S_un_b: TSunB);

      1: (S_un_w: TSunW);

      2: (S_addr: longword);

  end;

 

 IPAddr = TIPAddr;

 

function IcmpCreateFile: THandle; stdcall; external 'icmp.dll';

function IcmpCloseHandle(icmpHandle: THandle): Boolean; stdcall; external 'icmp.dll'

function IcmpSendEcho(IcmpHandle: THandle; DestinationAddress: IPAddr; RequestData: Pointer; RequestSize: Smallint;

                      RequestOptions: pointer; ReplyBuffer: Pointer; ReplySize: DWORD; Timeout: DWORD): DWORD; stdcall; external 'icmp.dll';

 

 

function Ping(const IP: string; TimeOut: Integer = 250): boolean;

 

implementation

 

uses WinSock;

 

function Fetch(var AInput: string; const ADelim: string = ' '; const ADelete: Boolean = True): string;

var

  iPos: Integer;

begin

  if ADelim = #0 then

  begin

    // AnsiPos does not work with #0

    iPos := Pos(ADelim, AInput);

  end

  else

    iPos := Pos(ADelim, AInput);

  if iPos = 0 then

  begin

    Result := AInput;

    if ADelete then AInput := '';

  end

  else

  begin

    Result := Copy(AInput, 1, iPos - 1);

    if ADelete then

      Delete(AInput, 1, iPos + Length(ADelim) - 1);

  end;

end;

 

procedure TranslateStringToTInAddr(AIP: string; var AInAddr);

var

  phe: PHostEnt;

  pac: PChar;

  GInitData: TWSAData;

begin

  WSAStartup($101, GInitData);

  try

    phe := GetHostByName(PChar(AIP));

    if Assigned(phe) then

    begin

      pac := 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

        raise Exception.Create('Error getting IP from HostName');

    end

    else

      raise Exception.Create('Error getting HostName');

  except

    FillChar(AInAddr, SizeOf(AInAddr), #0);

  end;

  WSACleanup;

end;

 

function Ping(const IP: string; TimeOut: Integer = 250) : boolean;

var

 Handle: THandle;

 InAddr: IPAddr;

 DW    : DWORD;

 rep   : array[1..128of byte;

begin

  result := false;

  Handle := IcmpCreateFile;

  if Handle = INVALID_HANDLE_VALUE then Exit;

  TranslateStringToTInAddr(IP, InAddr);

  DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 128, TimeOut);

  Result := (DW <> 0);

  IcmpCloseHandle(Handle);

end;

 

end.