Rede - rotina para ping

Top  Previous  Next

tem e funciona beleza super rapido , uso para saber se o servidor esta 

ativo e entao sincronizar os dados do ecf com o servidor

 

if not ChecaTCPPort(IPServidor,139,2) then

       ShowMessage('IP não e valido');

 

 

uses WinSock;

 

TSimpleFDSet = record

    fd_count: u_int;

    fd_array: array[0..0] of TSocket;

end;

 

function ChecaTCPPort(IPAddr: string; TCPPort: Word; Timeout: Integer): 

Boolean;

var

   S: TSocket;

   Addr: TSockAddrIn;

   NonBlocking: Integer;

   Sockets: TSimpleFDSet;

   Res: Integer;

   T: TTimeVal;

 

   function SocketsInit: Boolean;

   var

     Data: TWSAData;

   begin

     Result := WSAStartup($101, Data) = 0;

   end;

 

 

begin

   Result := False;

   s := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

   if s = INVALID_SOCKET then begin

     if WSAGetLastError = WSANOTINITIALISED then begin

       if not SocketsInit then EXIT;

       s := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

     end else EXIT;

   end;

   try

     NonBlocking := 1;

     if ioctlsocket(s, FIONBIO, NonBlocking) = SOCKET_ERROR then EXIT;

     FillChar(addr, SizeOf(addr), 0);

     addr.sin_family := PF_INET;

     addr.sin_port := htons(TCPPort);

     addr.sin_addr.S_addr := inet_addr(PChar(IPAddr));

     Res := connect(s, addr, SizeOf(addr));

     if Res = SOCKET_ERROR then begin

       if WSAGetLastError = WSAEWOULDBLOCK then begin

         Sockets.fd_count := 1;

         Sockets.fd_array[0] := S;

         T.tv_sec := 0;

         T.tv_usec := Timeout * 1000;

         Result := select(0, nil, @Sockets, nil, @T) = 1;

       end;

     end;

   finally

     closesocket(S);

   end;

end;

 

------------------------------------------------------------

usando o ICS: TPing

================================================================

.................... DELPHI 6 ................................

 

object ICMP: TIdIcmpClient

  ReceiveTimeout = 250

  OnReply = ICMPReply

end

 

var

  PingOk: Boolean;

 

procedure TForm1.ICMPReply(ASender: TComponent; const AReplyStatus: TReplyStatus);

begin

  PingOk := AReplyStatus.ReplyStatusType = rsEcho;

 //  PingOk := AReplyStatus.BytesReceived > 0;  NAO USE ESTE

end;

 

function TForm1.Pinga(const IP: string; TimeOut: Integer = 250): Boolean;

begin

  PingOk := False;

  Result := False;

  try

    ICMP.ReceiveTimeout:= TimeOut;

    ICMP.Host          := IP;

    ICMP.Ping;

    Result             := PingOk;

 // faz 2 vezes para ter certeza

    if not PingOk then 

 begin

   ICMP.Ping; 

      Result := PingOk;

 end;

  except

  end;

end;

 

.................... DELPHI 5 ................................

 

object Ping: TPing

  Address = 'abc'

  Size = 1

  Timeout = 250

  TTL = 64

  OnEchoReply = PingEchoReply

  OnDnsLookupDone = PingDnsLookupDone

end

 

////////////////////////////////////////////////////////////////////// COMPONENTE PING...

 

function TPrincipalForm.Pinga(const IP:string):Boolean;

begin

  PingOK := False;

  Ping.DnsLookup(IP);

  // Try AGAIN!

  if not PingOK then Ping.DnsLookup(IP);

  // Para cancelar o ping:   Ping1.CancelDnsLookup;

  Result := PingOk;

end;

 

procedure TPrincipalForm.PingDnsLookupDone(Sender: TObject; Error: Word);

begin

  if Error <> 0 then Exit;

  Ping.Address := Ping.DnsResult;

  Ping.Ping;

end;

 

procedure TPrincipalForm.PingEchoReply(Sender, Icmp: TObject; Error: Integer);

begin

  PingOk := not (Error = 0);

end;