• Publicidad

Socket Server

¿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.

Socket Server

Notapor adivisi » 2006-05-24 16:57 @748

Estimados,
Debo realizar un servidor de escucha. Buscando información al respecto, encontré el módulo IO::Socket::INET. Además encontré algunos ejemplos de server. Expongo uno de ellos:

Código: Seleccionar todo
#!/usr/bin/perl -w
        use IO::Socket;
        use Net::hostent; # for OO version of gethostbyaddr

        $PORT = 9000;
        $MAX_CLIENTS = 10;

        $server = IO::Socket::INET->new( Proto => 'tcp', LocalPort => $PORT, Listen => $MAX_CLIENTS, Reuse => 1);

        die "can't setup server" unless $server;
        print "[Server $0 accepting clients]\n";

        while ($client = $server->accept()) {

                $client->autoflush(1);
                print $client "Welcome to  \n";

                while ( defined( $line = <$client>) ) {

                        print $client $line . "\n";

                }

                close $client;
         }


y funciona Ok, pero cuando recibe la segunda conexión, la deja en cola, y no responde hasta que termine con la primera.

¿ A que se debe esto ?

Saludos
adivisi
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2006-05-24 16:34 @732

Publicidad

Notapor explorer » 2006-05-25 05:43 @280

Eso significa que falta hacer un fork después del accept, para que quede escuchando la siguiente petición mientras procesa la primera. Eso a nivel de proceso. O crear un nuevo thread. O usar select para distinguir las llamadas entrantes.

Tienes aqui un ejemplo hecho con fork:
Código: Seleccionar todo
 #!/usr/bin/perl -w
    use strict;
    use IO::Socket;
    my ($host, $port, $kidpid, $handle, $line);

    unless (@ARGV == 2) { die "usage: $0 host port" }
    ($host, $port) = @ARGV;

    # create a tcp connection to the specified host and port
    $handle = IO::Socket::INET->new(
        Proto     => "tcp",
        PeerAddr  => $host,
        PeerPort  => $port)
      or die "can't connect to port $port on $host: $!";

    $handle->autoflush(1);      # so output gets there right away
    print STDERR "[Connected to $host:$port]\n";

    # split the program into two processes, identical twins
    die "can't fork: $!" unless defined($kidpid = fork());

    # the if{} block runs only in the parent process
    if ($kidpid) {
        # copy the socket to standard output
        while (defined ($line = <$handle>)) {
            print STDOUT $line;
        }
        kill("TERM", $kidpid);        # send SIGTERM to child
    }
    # the else{} block runs only in the child process
    else {
        # copy standard input to the socket
        while (defined ($line = <STDIN>)) {
            print $handle $line;
        }
    }
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 adivisi » 2006-05-25 14:04 @628

Muchas gracias por la ayuda. Modificaré el script y veré cómo me va :)

Saludos
adivisi
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2006-05-24 16:34 @732


Volver a Intermedio

¿Quién está conectado?

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