Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   ¿Puerto TCP abierto en remoto? (https://www.clubdelphi.com/foros/showthread.php?t=37271)

urtKami 08-11-2006 09:18:43

¿Puerto TCP abierto en remoto?
 
Hola a tod@s.

Necesito averiguar si un perto TCP está abierto en una máquina Remota.
¿Es posible? ¿Cómo?
Gracias.

ppb 08-11-2006 15:22:21

Hay muchas herramientas , ahi va una http://sourceforge.net/projects/nmapwin

Crandel 08-11-2006 15:32:50

Me imagino a que se refiere a hacerlo por código y no con algun programa externo.

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.

Aunque no estoy seguro si se puede cambiar la direccion del puerto.

Ahhhh, otra idea que se acaba de ocurrir intentar, es conectarte con ese puerto, si te responde es porque esta abierto :D

seoane 08-11-2006 15:47:09

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 :D

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 :D

Crandel 08-11-2006 16:01:22

Cita:

Empezado por seoane
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 :D

A uno se le ocurre una idea y vos ya tiras el código :eek:

urtKami 08-11-2006 21:35:12

Gracias.
Probaré a ver si es operativo (tengo que ver muchas direcciones), pero esperaba que hubiera una forma mas directa con el WinApi.
Ya os comentaré.

seoane 08-11-2006 21:40:51

Cita:

Empezado por urtKami
Gracias.
Probaré a ver si es operativo (tengo que ver muchas direcciones), pero esperaba que hubiera una forma mas directa con el WinApi.
Ya os comentaré.

:confused: No se que idea tienes del "WinApi", pero la última vez que mire, las funciones que utilizo formaban parte de la API. ;)

urtKami 11-11-2006 19:02:39

Ya lo he conseguido.
Perdon por el retraso en el post, pero estuve fuera por trabajo.

Sabía que era con wl API de WinSock pero no sabía como.

Muchas gracias.

fide 31-03-2008 21:40:34

eso esta buenisimo, sobre todo para hacer un escaneador de puertos!


La franja horaria es GMT +2. Ahora son las 14:41:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi