• Publicidad

Se me cae un thread...

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Se me cae un thread...

Notapor Cole_Turner » 2008-01-15 13:24 @600

Hola foreros, os explico mi problemilla.

Tengo un programilla que abre 2 threads: uno de ellos abre un socket a la espera de conexiones y el otro esta conectado a un servidor IRC.

Al hilo que está escuchando del socket le hago un fork para que pueda tener más de una conexión simultánea.

¿Cuál es el problema? Lanzo el programa, todo OK. Hago una conexión al hilo que escucha, OK; pero cuando cierro esta conexión y abro otra, se cae el hilo que está conectado al IRC.

Este es el código del hilo que abre el socket.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub sub2 {
        $server = IO::Socket::INET->new( Proto     => 'tcp',
                                        LocalPort => 9999,
                                        Listen    => 10,
                                        Reuse     => 1);

        die "Error server" unless $server;
       
        print "[Server $0 Aceptando clientes]\n";
        my $client;
        while ( $client = $server->accept()) {
                $client->autoflush(1);
                my $child;
                die "Error en fork $!" unless defined ($child = fork());
       
                if ($child == 0) {
                        my $hostinfo = gethostbyaddr($client->peeraddr);
                        printf "[Connect from %s]\n", $hostinfo->name  || $client->peerhost;
                        $server -> close();
                        funcion($client);
                                exit 0;
                }else {
                        warn "Conexion recibida ... ", $client->peerhost,"\n";
                        $client -> close();
                }
                print ("Se acaba el mundo aki\n");
        }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


P.D - No conocía este foro y ahora ya es uno de mis favoritos :)
Cole_Turner
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-01-15 13:06 @587

Publicidad

Notapor explorer » 2008-01-15 14:02 @627

Un momento... ¿thread o fork? Son cosas distintas... Son compatibles, si, se pueden usar a la vez, pero no es lo normal.

En cuestión de temas de Networking, lo primero es ver el magnífico tutorial publicado en la Linux Journal. Ya tiene unos años, pero es la base para aprender. En la parte de comentarios, hay algunos muy modernos, comentando las diferencias con lo que se hacía hace 9 años.

Échale un vistazo al listado 8, que es un ejemplo de servidor con fork().

En cuanto a tu código, no lo he probado, pero me parece que está bien.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Cole_Turner » 2008-01-15 15:12 @675

Hola de nuevo, pues no sé si es normal, pero lo hice así porque no sé de qué otra manera hacerlo :).

A ver si me explico, es un programa que abre dos threads con threads, uno de los threads se conecta a un servidor irc a un canal y el otro thread es la función sub2 que postee anteriormente. Esa función abre un socket y escucha de él y para aceptar más de una conexión simultanea hago ese fork dentro de ese thread. Según tu, en vez de hacer un fork() ¿ahí podría hacer más threads? no sé, posiblemente :). Lo que no entiendo es porque la primera conexión la hace bien, lo que envío al socket lo pastea en el servidor irc, pero al desconectar y volver a conectar al socket y enviar nuevamente texto el thread que está conectado al irc se cae.

No sé si me he explicado. Un saludo.
Cole_Turner
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-01-15 13:06 @587

Notapor explorer » 2008-01-15 16:41 @736

Pues ni idea... quizás al matar un hilo o fork() se cierren los handle de la conexión, ya que se suelen compartir al crear un thread o fork y no se dupliquen para nuestro propio thread.

A ver si alguien más en el foro te puede ayudar...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

ok

Notapor Cole_Turner » 2008-01-16 11:43 @530

Al final, lo que he hecho ha sido utilizar threads para todo y ya no sucede el problema que tenía con el fork(). Muchas gracias y arriba este foro.
Cole_Turner
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-01-15 13:06 @587


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados