PDA

Ver la Versión Completa : threads multihilo


walito
13-06-2007, 18:31:53
Buenas, antes que nada, busque en el foro y no encontre nada :D por eso pregunto.

tengo un mambo en mi cabeza que me confunde mucho.
Necesito hacer un server multihilo, es decir un SOCKET en el puerto 1234 espero conexiones, hasta ahi todo bien, eso lo puedo hacer, ahora cuando alguien se conecta yo tengo que delegar esa conexion a otro hilo y que el se encargue del cliente pero el hilo principal con un SOCKET en el puerto 1234 tiene que quedar libre para la espera de mas conexiones, ahora no entiendo como hacer que el hilo que maneja al cliente (el socket) me genere un puerto disponible fuera del 1234 para que permanesca la conexion con el cliente.

Alguien tiene algun ejemplo de las lineas basicas para guiarme?

agradeceria!

Saludos

dec
13-06-2007, 18:40:46
Hola,

Creo que el programa Pico de nuestro compañero Seoane puede darte alguna que otra idea. Revisa este hilo (http://www.clubdelphi.com/foros/showthread.php?t=32112) y este este otro (http://www.clubdelphi.com/foros/showthread.php?t=42308).

seoane
13-06-2007, 18:42:41
Cuando un cliente se conecta a ti se crea automaticamente un socket que es lo que tienes que manejar dentro del thread, tu no tienes que abrir o crear nada dentro del thread. Pero antes de meternos mas a fondo ¿que componentes estas usando? ¿Indy, TServerSocket, TTCPServer? o quizá estas utilizando solo la API.

Si estas usando componentes, estos suelen encargarse de crear el thread y de darte un socket sobre el que leer y escribir, sin que tengas que preocuparte de nada mas. Si estas usando solo la API, en el hilo de código inútil encontraras un ejemplo muy sencillo de como hacerlo:

http://www.clubdelphi.com/foros/showpost.php?p=187916&postcount=2

Y si necesitas algo mas complicado:

http://www.clubdelphi.com/foros/showthread.php?t=32112

walito
13-06-2007, 19:01:11
Gracias por su respuestas.

Les cuento que lo estoy haciendo con lazarus, como no tiene componentes de socket instale el Lnet que anda joya, pero como no soporta el componente threads tengo que hacer mis thread para manejar las conexiones.

Ahora me baje el pico, que ustedes me comentan y lo vere con mas detencion, parece interesante.

Lo que estoy haciendo es en el main.pas:

procedure TForm1.Button1Click(Sender: TObject);
begin
tcp.Listen(1234, LADDR_ANY);
end;


Ahora lo que creo que tengo que hacer es en el onAccept:

procedure TForm1.TcpAccept(aSocket: TLSocket);
begin
//aqui codigo
end;


Me imagino que ahi tendre que llamar a mi thread.create y pasarle como parametro el aSocket y mantener en el execute la conexion, no? no se si estoy errado.

Gracias

seoane
13-06-2007, 19:05:42
Me imagino que ahi tendre que llamar a mi thread.create y pasarle como parametro el aSocket y mantener en el execute la conexion, no? no se si estoy errado.

Pues a mi me parece que vas por buen camino, aunque no conozco los componentes Lnet.

walito
13-06-2007, 19:34:26
Sabes que yo menos lo conocia, pero lo recomiendo, la verdad que me parecio mas facil q el Indy, jeje!

Bueno, yo sigo probando, si sale falcil hago un tutorialsito y lo posteo aca.

Saludos y gracias