• Publicidad

Inicializar valores

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

Inicializar valores

Notapor jcarranza » 2010-04-23 03:59 @207

¡¡Hola de nuevo!!

Tengo una comunicación cliente-servidor a través de un SOCKET. Lo que hace es que el cliente envía un string y el servidor lo transforma convirtiendo las mayúsculas a minúsculas y viceversa para acto seguido devolver el resultado al cliente. Una vez acabado el proceso, el servidor se queda a la espera de nuevos clientes.

Lo que me ocurre es que cada vez que inserto un nuevo string, éste se me acumula en memoria y a partir del segundo intento (2º cliente) el cliente no muestra el string correcto que tiene que devolver. Lo que tengo que hacer es inicializar la variable que hay en el servidor pero ¿cómo lo hago?.

Aquí les dejo mi código:

SERVIDOR
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. #servidor
  4.  
  5. use IO::Socket;
  6. system ("title SERVIDOR 4.1b");
  7.  
  8. $puerto = 9000;
  9. $protocolo="tcp";
  10.  
  11. $servidor = IO::Socket::INET->new(
  12.     Proto       => $protocolo,
  13.     LocalPort   => $puerto,
  14.     Listen      =>  1,
  15.     Reuse       =>  1,
  16. );
  17.  
  18. die "No puedo configurar el Servidor" unless $servidor;
  19.  
  20. system("cls");
  21. system ("color a");
  22.  
  23. print "\n";
  24. print scalar(localtime); print "\n\n";
  25. print "[Servidor INICIADO]\n\n";
  26. print "Puerto de comunicaciones: $puerto \n\n";
  27. print "Esperando conexiones remotas...\n\n";
  28.  
  29. $|++;
  30.  
  31.  
  32.  
  33. while( $remoto = $servidor->accept() ) #se mantiene a la espera de conexiones cliente
  34. {
  35.     $remoto->autoflush(1);
  36.         #activar el autoflush(), para que el envío de mensajes sea por cada línea, y no por bloques.
  37.         system("cls");
  38.     print "\nNuevo Cliente conectado!\n";
  39.         print "\a"; #beep del sistema
  40.        
  41.  
  42.     while($datos_cliente = <$remoto> )
  43.         {
  44.                
  45.                 print "Cadena recibida: $datos_cliente";
  46.                
  47.                
  48.                 #convertimos la cadena:
  49.                 for (split//,$datos_cliente)
  50.                 {                                                       # para cada cadena
  51.                         if (/[[:alpha:]]/)
  52.                         {                                               # si es carácter alfabético (en iso-8859-1)
  53.                                 $_ ^= chr 0x20;         # invertimos el bit 6, ya que hay una diferencia
  54.                                                                                 # de 32 caracteres entre las mayúsculas y las minúsculas
  55.                         }
  56.                        
  57.                         $datos_cliente2 .= $_;                  #guardamos el resultado en una variable
  58.                         #$|=1;
  59.                 }
  60.                
  61.                 print "Cadena Convertida: $datos_cliente2";
  62.                 print "\n\n";
  63.                
  64.                 #enviamos la cadena al cliente
  65.                 print $remoto $datos_cliente2;
  66.                
  67.     }
  68.  
  69.  
  70.  
  71.  
  72. }
  73.  
  74. continue {
  75.             print "<< Pasando al MODO DE ESPERA >>\n";
  76.                 close $remoto;
  77. }
  78. #print "\nSOCKET Cerrado\n";
  79. #print "Pulse INTRO para continuar";
  80. #$nada=<STDIN>;
  81.  
  82. close $servidor;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4




CLIENTE

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. #CLIENTE MUY SENCILLO
  3.  
  4. use IO::Socket;
  5. system ("title CLIENTE 4.1b");
  6.  
  7. $puerto = 9000;
  8. $protocolo="tcp";
  9.  
  10. $cliente = IO::Socket::INET->new(
  11.     Proto       => $protocolo,
  12.     PeerAddr    => "localhost",
  13.     PeerPort    =>  $puerto,
  14.     Reuse       =>  1,
  15.  
  16. );
  17.  
  18. die "problema" unless $cliente;
  19.  
  20. system ("cls");
  21. print scalar(localtime); print "\n\n";
  22. print "[Cliente INICIADO] --> Puerto de comunicaciones: $puerto \n\n";
  23. system ("color a");
  24. print "ESTA COMUNICACION SIRVE PARA ENVIAR UNA CADENA AL SERVIDOR Y QUE LA DEVUELVA \nCAMBIANDO LAS MAYUSCULAS A MINUSCULAS Y VICEVERSA \n\n";
  25.  
  26.  
  27.  
  28. print "Introduce un texto para enviar: ";
  29. $mensaje = <STDIN>;
  30. system ("color 7");
  31. print $cliente $mensaje; #envío el mensaje al servidor a través del socket abierto.
  32.  
  33.  
  34. #recibo el mensaje del servidor y lo muestro en pantalla
  35. $mensaje_recibido = <$cliente>;
  36. print "\nCadena Transformada enviada por el servidor: $mensaje_recibido";
  37. print "\n";
  38.  
  39.  
  40. close $cliente or die "close: $!";
  41.  
  42. print "\nSOCKET Cerrado\n";
  43. print "Pulse INTRO para continuar";
  44. $nada=<STDIN>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Publicidad

Re: Inicializar valores

Notapor explorer » 2010-04-23 04:27 @227

Claro, en el servidor, los datos se van acumulando en $datos_cliente2, pero no hay ningún sitio donde pongas esa variable a cero o cadena vacía.

Debes aprender a usar variables locales, y no globales, como estás usando ahora.

La solución pasa por definir la variable $datos_cliente2 como local en el bucle donde se utiliza:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 my $datos_cliente2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así, la variable "desaparece" cuando el bucle termina y vuelve a "crearse" en el siguiente ciclo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Inicializar valores

Notapor jcarranza » 2010-04-23 10:28 @477

Efectivamente... y así lo tenía pero no sé qué demonios pasaba que no me lo cogía. He quitado la línea $|++ y he inicializado la variable y parece ser que funciona.

Gracias por todo y hasta la próxima... ¡¡que será muy pronto!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250


Volver a Básico

¿Quién está conectado?

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

cron