Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber si un puerto esta abierto (https://www.clubdelphi.com/foros/showthread.php?t=49005)

Besto 10-10-2007 15:14:04

Saber si un puerto esta abierto
 
Hola,

antes de nada, no se si este es el foro adecuado, pero no veia claro donde ponerlo.

Trabajo en Delphi 6.

Bueno, mi problema es el siguiente, estoy desarrollando una aplicación y necesito saber si los equipos instalados dentro de la oficina tienen abiertos diversos puertos o no lo tienen abiertos.

He probado a usar un ClientSocket y si solo le pido comprobar un equipo me funciona bien (creo, ...), ahora si quiero comprobar varios equipos a la vez (todos los de un departamento, por ejemplo) , me empieza a dar error,...

Bueno, cualquier ayuda me vendría bien,...

Gracias.

pmcastilla 10-10-2007 15:21:05

Hola Besto,
No me quedo muy claro, pero creo que deberias trabajar con Threads (Hilos) para poder comprobar el mismo puerto en multiples ip. Lo que creo que estas intentando hacer es lo que se suele conocer como un "Sniffer".

pmcastilla 10-10-2007 15:23:12

Tal vez te sirva este articulo:
http://www.clubdelphi.com/foros/show...ghlight=Thread
Saludos!!!

seoane 10-10-2007 15:24:41

¿Como usas el Clientsocket? ¿Y que error te da? :confused:

Besto 10-10-2007 15:38:39

Bueno, gracias pmcastilla pero eso exactamente no es lo que quiero. Voy a ver si me explico.

La aplicación es para comprobar si los equipos tienen instalado diverso software y si el servicio está activo, RAdmin por ejemplo, entonces lo que queremos ver es si el puerto correspondiente esta abierto.

Yo creo que el error que me da es debido a que no esta abierto, pero no se como esperar a que termine la comprobación antes de mandar la siguiente y yo creo que se me cruzan.

Lo que hago es lo siguiente:
while not fin de la base de datos do
begin
clientSocket.port := 2701;
ClientSocket.Host := 'Dir IP1';
ClientSocket.Active := true;
next;
end;

Me he fijado cuando pongo Active a true no siempre me salta el evento OnConnect.

Bueno, Seoane el error que me da es el siguiente:

Asyncronous socket error 10049

Gracias a los dos por vuestra rapidez.

duilioisola 10-10-2007 15:43:03

Y si ponés todo entre un try ... except?

Código Delphi [-]
while not fin de la base de datos do
begin
   clientSocket.port := 2701;
   ClientSocket.Host := 'Dir IP1';
   try
      ClientSocket.Active := true;
   except
      on e:exception do 
         ShowMessage('Error en ClientSocket.Active '+#13+#10+e.Message)
   end
   next;
end;
o
Código Delphi [-]
while not fin de la base de datos do
begin
   clientSocket.port := 2701;
   ClientSocket.Host := 'Dir IP1';
   try
      ClientSocket.Active := true;
   except
      on e:exception do 
         ShowMessage('Puerto '+IntToStr(clientSocket.port)+' de la direccion '+ClientSocket.Host+' está cerrado.'+#13+#10+e.Message)
   end
   next;
end;

Besto 10-10-2007 15:53:41

Ya probé con eso pero es que no me salta la excepción, tambien he puesto que me de un mensaje en el evento onerror y tampoco me sale nada.

Gracias de todos modos.

pmcastilla 10-10-2007 16:08:02

Hola Besto,
De casualidad, se que tal vez te digo una tonteria, pero intentaste poner un Break Pint e ir paso a paso para ver donde tilda?

pmcastilla 10-10-2007 16:12:04

Antes de realizar los cambios de ip debes cerrar el puerto, sino genera un conflicto y tirar error.
Proba el mismo codigo con esa extra linea.
Código Delphi [-]
while not fin de la base de datos do
begin
//Extra Linea
   ClientSocket.Active := False;
   clientSocket.port := 2701;
   ClientSocket.Host := 'Dir IP1';
   try
      ClientSocket.Active := true;
   except
      on e:exception do 
         ShowMessage('Puerto '+IntToStr(clientSocket.port)+' de la direccion '+ClientSocket.Host+' está cerrado.'+#13+#10+e.Message)
   end
   next;
end;

seoane 10-10-2007 16:14:16

Un par de cosillas:

1 - Aquí tienes un código que hace lo que quieres. Pero ten en cuenta que si el puerto no esta abierto, puede tardar un poco de tiempo en terminar la función. Así que, o tienes paciencia o usas threads :D

http://www.clubdelphi.com/foros/show...85&postcount=4

2 - En ese bucle que pones veo que pones active a TRUE pero no veo que lo pongas a FALSE. :rolleyes:

3 - Si estas usando sockets asíncronos el try except de poco te va a servir.

Besto 10-10-2007 16:15:03

Lo puse, y no tengo ni idea de donde falla, voy siguiendo todos los pasos y cuando saco un mensaje de final, me aparecen todos los errores y cuando pongo el clientsocket activo no se me ejecuta el evento onconect.

También pasa una cosa curiosa, yo pongo el clientsocket active:= true, pero cuando cambio la ip antes de cambiar el host compruebo si está activo para si está ponerlo a false y luego cambiar el host, bueno pues aunque en principio debia esta a true, la verdad es que esta a false, ...

No sé si se entiende bien, porque no lo entiendo ni yo...

pmcastilla 10-10-2007 16:26:50

Estas usando un componente Indy? Como dice Seaone, debes cerrar el puerto antes de cargar la nueva informacion. En muchos casos hay que hacer un Disconnect y luego desactivar el puerto.
Tu ultimo comentario no lo he entendido. Pero tal vez si puedes poner el fragmento de codigo lo podamos analizar. :)

Besto 10-10-2007 16:30:00

Gracias a todos, pero me parece que con el último mensaje de Seoane me va a funcionar. Lo voy a mirar con calma a ver como funciona, pero de momento he probado un par de departamentos y aunque tarda un poco, no me sale error y parece que va.

Gracias a todos, con vosotros es un placer preguntar.

Comfirmado, es exactamente lo que quería, hay alguna cosa que no entiendo bien, pero funcionar, funciona. Lo demás es cosa de mirarlo con más calma.


La franja horaria es GMT +2. Ahora son las 05:06:34.

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