Ver Mensaje Individual
  #4  
Antiguo 08-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Cita:
Empezado por Crandel
Nunca lo hice pero podrias probar hacer un ping a un puerto específico. Creo que la suite de Indy trae un componente para hacer ping.
Hasta donde yo se "ping" utiliza el protocolo ICMP que no tiene puertos.

En cuanto a la pregunta urtKami no conozco otra forma de hacerlo que intentar conectar con ese puerto, si podemos esta abierto, si no podemos esta cerrado

Código Delphi [-]
uses WinSock;

function EstaAbierto(Host: string; Puerto: Integer): Boolean;
var
  WSAData: TWSADATA;
  Address: u_long;
  HostEnt: phostent;
  Addr: sockaddr_in;
  CSocket: Tsocket;
begin
  Result:= FALSE;
  if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
  begin
    Address:= inet_addr(Pchar(Host));
    if Address = INADDR_NONE then
    begin
      HostEnt:= gethostbyname(PChar(Host));
      if HostEnt <> nil then
        Address:= PInteger(HostEnt.h_addr_list^)^;
    end;
    if Address <> INADDR_NONE then
    begin
      CSocket:= socket(AF_INET, SOCK_STREAM, 0);
      if CSocket <> INVALID_SOCKET then
      begin
        Addr.sin_family:= AF_INET;
        Addr.sin_addr.S_addr:= Address;
        Addr.sin_port:= htons(Puerto);
        Result:= connect(CSocket, Addr, Sizeof(Addr)) <> SOCKET_ERROR;
        Closesocket(CSocket);
      end;
    end;
    WSACleanup;
  end;
end;


// Por ejemplo
 if EstaAbierto('www.clubdelphi.com',80) then
   ShowMessage('Esta abierto')
 else
   ShowMessage('Esta cerrado');

PD: Si el puerto esta cerrado, puede que tarde un rato en responder, ten paciencia
Responder Con Cita