• Publicidad

Error con sockets en Perl

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

Error con sockets en Perl

Notapor macaruchi » 2010-03-24 20:21 @890

Este es mi primer post en este foro... Espero puedan ayudarme.

Estoy desarrollando un programa con sockets de un ejemplo que vi en este foro

Este es el código del server:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use IO::Socket;
  2. print "Server Socket Program... \n";
  3.  
  4. $sock  = new IO::Socket::INET(
  5.          LocalPort => 1234,
  6.          Listen => 128,
  7.          Reuse => 1,
  8.          Proto => 'tcp') || die "Error creating socket: $!";
  9.  
  10. print "-- Server Program --\n";
  11. while($cliente = $sock->accept() )
  12. {    
  13.         $cliente->autoflush(1);
  14.         while (defined($line=<$cliente>))
  15.          {
  16.            print $line "Welcome \n";
  17.           }
  18.  }
  19.  
  20. close($sock);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El cliente que hice para probar es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl-w
  2. use IO::Socket;
  3. $sock=IO::Socket::INET->new(
  4.                         PeerAddr=>"192.168.227.1",
  5.                         PeerPort=>1234,Proto=>'tcp',
  6.                         Timeout=>5) || die "Error creating socket: $!";
  7.  
  8. $msg='Probando enviar msg por socket';
  9. print $sock $msg;
  10. close $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El servidor lo hice en Windows y el cliente está en Linux pero cuando lo corro, el mensaje nunca llega al server. He hecho de todo y la verdad ya no sé qué más poner. Este ejemplo lo tomé de este foro con una discusión parecida que había aquí.

¿Alguien puede ver y darme una pista? ¿Existe alguna forma de hacer un debug?
El cliente no emite ningún error cuando se conecta por lo que asumo que está haciendo bien la conexión.

Gracias.
macaruchi
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-09-08 14:22 @640

Publicidad

Re: Error con sockets en Perl

Notapor explorer » 2010-03-25 04:49 @242

Buenas, macaruchi, después de 4 años :)

Hay unos pequeños detalles que hay que indicar bien, para que funcione.

Servidor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use IO::Socket;
  6.  
  7. print "Server Socket Program... \n";
  8.  
  9. my $sock = IO::Socket::INET->new(
  10.     LocalHost => 'localhost',             # Opcional. Indicamos en dónde escuchamos
  11.     LocalPort => 1234,                    # Por dónde
  12.     Listen    => 125,                     # Número de oyentes
  13.     Reuse     => 1,                       # Admitir nuevas peticiones de forma simultánea
  14.     Proto     => 'tcp',                   # Protocolo
  15. ) or die "Error creating socket: $!\n";
  16.  
  17. $|++;                                     # No caché en pantalla
  18.  
  19. print "-- Server Program --\n";
  20.  
  21. while (my $cliente = $sock->accept() ) {      # Esperamos
  22.     print "¡Conexión!\n";
  23.  
  24.     $cliente->autoflush(1);
  25.  
  26.     while (defined(my $line = <$cliente>)) {
  27.         print "Welcome: $line\n";             # Imprimimos lo recibido
  28.     }
  29.  
  30.     print "Fin de Conexión\n";
  31. }
  32.  
  33. close($sock);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use IO::Socket;
  6.  
  7. my $sock = IO::Socket::INET->new(
  8.     PeerAddr => 'localhost',                # A dónde hay que conectarse
  9.     PeerPort => 1234,                       # y en qué puerto
  10.     Proto    => 'tcp',                      # y con qué protocolo
  11.     Timeout  => 30,                         # tiempo máximo de espera de conexión
  12. ) or die "Error creating socket: $!\n";
  13.  
  14. my $msg='Probando enviar msg por socket';
  15. print $sock $msg;                           # y enviamos el mensaje
  16. close $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ten en cuenta que el puerto 1234 debe estar libre, en el ordenador que hará de servidor. Con el comando netstat (Windows y Linux) puedes ver las conexiones actuales.
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: Error con sockets en Perl

Notapor macaruchi » 2010-04-02 08:29 @395

Gracias, ya pude resolver el problema, no de esa forma, pero lo logré. Sí, ¡cómo pasa el tiempo...!
:P

Otra pregunta, ahora estoy pasando mensajes de texto por el cliente al servidor pero quiero que el server me envié a mi un archivo de audio por el mismo socket.

¿Podría enviar un mensaje de texto al server y que éste me envíe un archivo de audio? Básicamente lo que hago es una petición del archivo que quiero y éste me retorne dicho archivo por el mismo socket que está abierto.
macaruchi
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-09-08 14:22 @640

Re: Error con sockets en Perl

Notapor explorer » 2010-04-02 10:11 @466

Para realizar eso, te vale con un simple servidor HTTP o FTP, pero si lo quieres hacer a muy bajo nivel, primero debes describir el protocolo que vas a usar.

Debes decir qué información, cuándo y cómo se va a intercambiar, entre servidor y cliente.

Si vas a intercambiar texto y luego un fichero binario, el cliente y el servidor deben saber cuándo termina uno y empieza el otro.

Por ejemplo, si el cliente solicita un listado de los ficheros disponibles, el servidor debe responder con un mensaje de texto, con el nombre de cada fichero, y si es posible, con su tamaño. Cuando el cliente solicite un fichero, debe, a continuación, esperar una entrada igual al tamaño indicado antes. Para eso, con la función read() viene muy bien, porque podemos indicar el tamaño exacto que esperamos. En el servidor, leemos de forma binaria el fichero y lo mandamos con un print() por el sockect.
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


Volver a Básico

¿Quién está conectado?

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