• Publicidad

Crear socket que soporte más de de dos clientes

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Crear socket que soporte más de de dos clientes

Notapor BigBear » 2010-01-05 17:20 @764

Hola a todos. Tengo el siguiente código

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use IO::Socket;
  4. use Net::hostent;
  5.  
  6. $PORT = 9000;          
  7.  
  8. $server = IO::Socket::INET->new( Proto     => 'tcp',
  9.                                  LocalPort => $PORT,
  10.                                  Listen    => 3,
  11.                                  Reuse     => 3);
  12.  
  13. while ($client = $server->accept()) {
  14.   $client->autoflush(1);
  15.   print   $client q(
  16.                                        
  17.   Bienvenido
  18. );
  19.  
  20.   while ( <$client>) {
  21.     next unless /\S/;  
  22.     if    (/quit|exit/i)
  23.          { last;                                    }
  24.     elsif (/date|time/i)
  25.          { printf $client "%s\n", scalar localtime; }
  26.  
  27.     elsif (/net user/i )
  28.          { print  $client ` net user `;     }
  29.     elsif (/tree/i )
  30.          { print  $client `tree `;     }
  31.     elsif (/dir/i )
  32.          { print  $client `dir `;     }
  33.     elsif (/ipconfig/i )
  34.          { print  $client `ipconfig `;     }
  35.     elsif (/ftp/i )
  36.          { print  $client `ftp `;     }
  37.     elsif (/telnet/i )
  38.          { print  $client `telnet `;     }
  39.     elsif (/del/i )
  40.          { print  $client `del `;     }
  41.     elsif (/copy/i )
  42.          { print  $client `copy `;     }
  43.     elsif (/move/i )
  44.          { print  $client `move `;     }
  45.     elsif (/cls/i )
  46.          { print  $client `cls `;     }
  47.     elsif (/net localgroup/i )
  48.          { print  $client `net localgroup `;     }
  49.     elsif (/attrib/i )
  50.          { print  $client `attrib `;     }
  51.     elsif (/at/i )
  52.          { print  $client `at `;     }
  53.     elsif (/route/i )
  54.          { print  $client `route `;     }
  55.     elsif (/cd/i )
  56.          { print  $client `cd `;     }
  57.     elsif (/tlntadmn/i )
  58.          { print  $client `tlntadmn `;     }
  59.     elsif (/type/i )
  60.          { print  $client `type `;     }
  61.     elsif (/start/i )
  62.          { print  $client `start `;     }
  63.     elsif (/md/i )
  64.          { print  $client `md `;     }
  65.     elsif (/netstat/i )
  66.          { print  $client `netstat `;     }
  67.     elsif (/nbtstat/i )
  68.          { print  $client `nbtstat `;     }
  69.     elsif (/set/i )
  70.          { print  $client `set `;     }
  71.     elsif (/find/i )
  72.          { print  $client `find `;     }
  73.     else {
  74.          print   $client q(
  75. Bienvenido
  76. );
  77.          print $client " que desea hacer ?\n";
  78.     }
  79.   } continue {
  80.      print $client "now? ";
  81.   }
  82.  
  83.   close $client;
  84. }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4



Lo que quiero es que soporte más dos clientes porque cuando quiero conectarme con más dos clientes, no funciona. Lo raro es que yo puse que soportara 2 clientes en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
Listen    => 3,
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero éste no soporta más de uno. ¿Cómo debería arreglar el código para que soportara más de dos clientes?
Última edición por explorer el 2010-01-05 18:12 @800, editado 1 vez en total
Razón: Ortografía, formateo del código
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Crear socket que soporte más de de dos clientes

Notapor explorer » 2010-01-05 18:28 @811

Si ves el tercer listado de la famosa página de la web de Linux Journal dedicada a los servicios en red desde Perl, verás que tienes bien definida la conexión.

Lo malo es que, cuando ocurre la primera conexión, entras en un bucle while(), del que solo sales si se corta la conexión. Aunque tengas permitido el Reuse de la conexión, no permites que ocurra un accept(), que es lo que ocurre en el primer while().

La solución pasa por crear un fork() del proceso en cuanto ocurre una nueva conexión. Es decir, creamos un nuevo hilo de ejecución. Uno de los hilos seguirá esperando más conexiones, mientras que el nuevo hilo se dedicará a atender al cliente que se acaba de conectar.

Lo tienes explicado a partir de la sección "A Forking Server", y listado nº 8, de la misma página enlazada antes.
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

Re: Crear socket que soporte más de de dos clientes

Notapor salva » 2010-01-06 12:15 @552

Murdoc Rush escribiste:¿Cómo debería arreglar el código para que soportara más de dos clientes?

A bajo nivel, la solución, como ya ha comentado explorer, pasa por hacer un fork que cree otro proceso donde gestionar la nueva sesión...

Pero con Perl, es más sencillo utilizar alguno de los módulos que existen en CPAN y que se encargan de todo el trabajo sucio de gestión de procesos y sockets dejándote a ti únicamente la tarea de programar el protocolo de comunicación cliente/servidor. El módulo más popular probablemente sea Net::Server.

Otra buena alternativa, especialmente si tu programa no va a tener un uso excesivo, es colgarlo de inetd.

Bueno, y luego siempre está la posibilidad de, sin crear nuevos procesos, usar sockets no bloqueantes y gestionar la entrada/salida con la ayuda de select (o con POE). ¡Pero es un camino bastante más complicado!
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680


Volver a Básico

¿Quién está conectado?

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

cron