Ir para conteúdo
  • Cadastre-se

dev botao

teste de ping na rede


Ver Solução Respondido por Waldir Paim,
  • Este tópico foi criado há 2593 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Olá a todos,

Possuo um sistema de emissão de NFC-e e quero que o mesmo funcione caso o servidor pare de funcionar, para isso gravo as vendas localmente e conforme o servidor esteja online eu dou carga nele.

Até aí tudo bem, mas para saber se devo dar carga, preciso checar se o servidor está online na rede. Uso o Delphi 2010 e estou usando o seguinte código para a checagem:

Citar

 

function Tfrm_nfce_pdv.ExecutaPing(HostName: String): boolean;
var
  PckEntregue : Array[1..3] of Integer;
  ICMP : TIdIcmpClient;
begin
  try
   ICMP := TIdIcmpClient.Create(nil);
    try
     ICMP.Host := HostName;
     ICMP.ReceiveTimeout := 300;
     ICMP.Ping;
      if ICMP.ReplyStatus.BytesReceived > 0 then
       result := true
       else
        result := false;
    except
     result := false;
    end;
  finally
    ICMP.Destroy;
  end;
end;

 

if ExecutaPing(ip_servidor) Then
      begin

     //comandos

      end;

 

O problema é que nem sempre leva os 300 milisegundos especificados para ele desistir do ping e avisar sobre a desconexão do servidor. As vezes leva segundos. Alguém saberia como resolver essa lentidão e fazer o comando obedecer o timeout especificado?

Desde já agradeço a atenção de todos

Editado por doidopb
Link para o comentário
Compartilhar em outros sites

  • Consultores

Tente fazer usando ou a API do Windows ou usando WMI. Veja nesse tópico:

 

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Olá EMBarbosa, tudo bom?

Eu já havia visto esse tópico, com o WMI ocorre a mesma lentidão as vezes, o que sugere que ele não obedece o timeout especificado.

Com a API do Windows, não consegui fazer rodar, estou tentando com o código do link abaixo:

http://www.delphipages.com/articles/ping_without_raw_sockets-9220.html

Você já precisou realizar um teste parecido? Obteve exito com o timeout? Se sim, peço que poste seu código como exemplo.

Desde já agradeço a atenção

 

Editado por doidopb
Link para o comentário
Compartilhar em outros sites

  • Moderadores
  • Solution

@doidopb

Use a classe TPingSend da synapse.

Segue função que utilizo:

Declare na uses a unit pingsend

function PingHost(const AHost: string; ATimeoutPing: integer; ASocksTimeout:
  integer): Boolean;
var
  VPing: TPingSend;
begin
  Result := False;
  if (AHost = '') then
    Exit;
  VPing := TPingSend.Create;
  try
    VPing.Sock.CloseSocket;
    VPing.Sock.Purge;
    VPing.Sock.SetTimeout(ASocksTimeout);
    VPing.Sock.SetSendTimeout(ASocksTimeout);
    VPing.Sock.SetRecvTimeout(ASocksTimeout);
    VPing.Timeout := ATimeoutPing;
    try
      Result := VPing.Ping(AHost);
      if Result then
        Result := (VPing.ReplyError = IE_NoError);
    except
      Result := False;
    end;
    VPing.Sock.CloseSocket;
  finally
    VPing.Free;
  end;
end;

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Olá Waldir,

Testei em duas máquinas aqui no laboratório e funcionou de primeira, sem demoras, agora irei levar aos clientes. Muito obrigado mesmo, "quebrou uma árvore".

Só me tira uma dúvida sobre os parâmetros...

  • O primeiro é o Host, óbvio.
  • O segundo provavelmente é o timeout, correto? Coloquei aqui 300, que suponho serem 300 milissegundos.
  • O terceiro se trata do que? Qual valor devo colocar?

Abraços e novamente obrigado

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@doidopb

Citar

By this method you may turn address reuse mode for local Bind. It is good specially for UDP protocol. Using this with TCP protocol is hazardous!

Public procedure SetTimeout(Timeout: Integer);

Try set timeout for all sending and receiving operations, if socket provider can do it. (It not supported by all socket providers!)

Public procedure SetSendTimeout(Timeout: Integer);

Try set timeout for all sending operations, if socket provider can do it. (It not supported by all socket providers!)

Public procedure SetRecvTimeout(Timeout: Integer);

Try set timeout for all receiving operations, if socket provider can do it. (It not supported by all socket providers!)

 

Da uma lida na documentação:

http://synapse.ararat.cz/doc/help/blcksock.TBlockSocket.html#SetSendTimeout

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Então Waldir, eu já tinha lido isso, mas para ser sincero esse termo "socket" é novo para mim.

Pelo que eu pude ententer, trata-se de um outro Timeout só que especifico para esse "socket". Você nesse terceiro parâmetro da função que me passou costuma repetir o tempo especificado no segundo (que trata-se do timeout normal) ou coloca algum valor diferenciado?

Link para o comentário
Compartilhar em outros sites

  • 6 meses depois ...
  • Consultores

Para futura referência, estou adicionando esse link para o comando IcmpSendEcho que é a recomendação quando precisa-se de performance ou teste de vários servidores.

O uso de IcmpSendEcho já estava nos outros links deste tópico, mas não a recomendação acima.

Vale lembrar que o comando IcmpSendEcho pode estar na Icmp.dll no Windows 2000 ou Iphlpapi.dll no Windows XP ou posterior. Como deve ser tratado está no link do MSDN e em comentários do artigo falando sobre o ping via WMI.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2593 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...