Fórum Erro com PING no windows 7 #478303

08/05/2014

0

Bom dia.
Tenho uma função que verifica através de ping se o servidor está ligado, pra poder conectar a base de dados.

Somente no windows 7 é retornado sempre como desligado, mesmo num ping para "www.terra.com.br" por exemplo.
Testo com XP na mesma rede e o ping é executado como True.

Testei em vários micros com windows 7, com situações diferentes, sem firewall, sem antivirus e não consigo localizar o erro.

Segue DEMO com a função.
Mario Inacio

Mario Inacio

Responder

Posts

08/05/2014

Mario Inacio

Unit da função PING:

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 uPing(InetAddress : string) : boolean;
function ByteToString2(const Value: array of byte): String;

implementation

uses
  WinSock;

function ByteToString2(const Value: array of byte): String;
var
    I: integer;
    S : String;
    Letra: char;
begin
    s := '';
    for i := length(value)-1 downto 0 do begin
       letra := chr(value[i]);
       s     := letra + s;
    end;
    result := s;
end;


function Fetch(var AInput: string; const ADelim: string = ' '; const ADelete: Boolean = true): string;
var
   iPos: Integer;
begin
   if ADelim = #0 then
      iPos := Pos(ADelim, AInput)
   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 begin
            raise Exception.Create('Error getting IP from HostName');
         end;
      end else begin
         raise Exception.Create('Error getting HostName');
      end;
   except
      FillChar(AInAddr, SizeOf(AInAddr), #0);
   end;
   WSACleanup;
end;

function uPing(InetAddress : string) : boolean; 
var
   Handle : THandle;
   InAddr : IPAddr;
   IP1,IP2: string;
   DW : DWORD;
   rep : array[1..128] of byte;
begin
   Result := False;
   try
      Handle := IcmpCreateFile;
      if Handle = INVALID_HANDLE_VALUE then
         exit;
      TranslateStringToTInAddr(InetAddress, InAddr);
      DW     := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 128, 0);
      Result := (DW <> 0);
   finally
      IcmpCloseHandle(Handle);
   end;
end;

end.
Responder

Gostei + 0

15/05/2014

Mario Inacio

Alguma idéia?
Responder

Gostei + 0

15/05/2014

Ricardo

O serviço RPC do Windows 7 deve ter parado. Já passei por isso várias vezes nas estações da empresa onde trabalhava e também tinha um aplicação que verificava se determinados equipamentos espalhados pela cidade estavam Online através de PING.
Responder

Gostei + 0

15/05/2014

Mario Inacio

Ola Ricardo.

Como verifico se este serviço (qual seu nome) está rodando e como ressucita-lo?
Responder

Gostei + 0

15/05/2014

Ricardo

Executa o services.msc e localiza o serviço "Alocador Remote Procedure Call (RPC)" esse serviço tem que estar rodando para poder haver comunicação da máquina na rede local.
Responder

Gostei + 0

16/05/2014

Mario Inacio

Bom dia,
Esse serviço estava desativado.

Ativei mas continuou não pingando.
Responder

Gostei + 0

19/05/2014

Mario Inacio

Olá Ricardo,

Você pode me passar sua função que executa o PING, pois a que estou utilizando, continua dando erro.

mario@aldus.com.br
Responder

Gostei + 0

27/05/2014

Nelson Santos

ganhe dinheiro com softwares 3D em Delphi 7
http://www.3dsistemas.com.br
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar