• Publicidad

Socket cliente servidor

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

Socket cliente servidor

Notapor panterozo » 2010-01-28 11:37 @526

Este es el server que recibe la info del cliente... Lo que deseo hacer es que devuelva al cliente un mensaje...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use IO::Socket;
  5. use Hola::hola;
  6.  
  7. our $PORT               = 3121;        
  8. our $PROTO              = 'tcp';       
  9. our $CLIENTS    = 128;         
  10.   my $TIME_OUT = 5;
  11. my $server = IO::Socket::INET->new( Proto => $PROTO,
  12.                                     LocalPort => $PORT,
  13.                                     Listen    => $CLIENTS,
  14.                                     Reuse     => 1);                                   
  15. if (not defined $server){       # Si es que no se puede levantar el socket.
  16.         print "No se puede levantar el servidor. Compruebe si el puerto $PORT no está utilizado por otro proceso.";
  17.         exit(1);       
  18. }
  19. my $socket_client;
  20. while ($socket_client = $server->accept())
  21. {
  22.                 my $client = new Hola::hola($socket_client);#Un modulo..
  23.                 my $ip_client=$client->ip();
  24.                 $client->enviar($client->select);
  25. }
  26. close($server);
  27.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Paquete Hola
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. package Hola::hola;
  3. use strict;
  4. use IO::Select;
  5.  
  6. my $TIME_OUT = 5; # 5 Segundos de Timeout
  7. my $message= "Estoy en el server\n";
  8.  
  9. sub new {
  10.         my ($class, $socket) = @_;
  11.         $socket->autoflush(1);#Para que es el autoflush???
  12.         die "Socket no instanciado!!" if not defined $socket;
  13.         my $client_ip   = unpack("C C",$socket->peeraddr);                                                                              # Obtiene la IP del cliente.
  14.         my $self = {
  15.         _IP => $client_ip,
  16.                 _socket => $socket,
  17.                 _select => undef,
  18.                 _dbConnection => undef,
  19.                 _countTriesAuth => 1,
  20.                 _cli_id => undef,
  21.                 _cli_handle => undef
  22.     };
  23.     bless $self, $class;
  24.         $self->select(IO::Select->new($socket));#Esta parte del codigo nose para que funciona... esto lo obtuve de alguna pagina web, para crear una instancia del cliente
  25.     return $self;
  26. }
  27.  
  28.                
  29. sub ip {
  30.     my ($self, $_ip) = @_;
  31.     $self->{_IP} = $_ip if defined $_ip;
  32.     return $self->{_IP};
  33. }
  34.  
  35. sub dns {
  36.     my ($self, $_dns) = @_;
  37.     $self->{_DNS} = $_dns if defined $_dns;
  38.     return $self->{_DNS};
  39. }
  40.  
  41. sub select {
  42.     my ($self, $_select) = @_;
  43.     $self->{_select} = $_select if defined $_select;
  44.     return $self->{_select};
  45. }
  46.  
  47.  
  48. sub enviar {
  49.         my ($message, $select) = @_;
  50.         my @fh = $select->can_write($TIME_OUT);
  51.         if (@fh) {
  52.                 $fh[0]->send(pack ('N', length($message) + 4));
  53.                 $fh[0]->send($message);
  54.         }
  55. }
  56.  
  57.  
  58. 1;
  59.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y por último, el cliente propiamente tal...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use IO::Socket;
  6.  
  7. my $sock = new IO::Socket::INET (
  8.         PeerAddr => 'localhost',
  9.         PeerPort => '3121',
  10.         Proto => 'tcp',
  11.         );
  12. die "Could not create socket: $!\n" unless $sock;
  13. my $message_length=0;
  14. my $message_data='';
  15. $sock->read($message_length,4);
  16. $sock->read($message_data, unpack ('N', $message_length)-4);
  17. print "$message_data";
  18. close($sock);
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo ejecuto por la consola y aparece lo siguiente:
Hola::hola=HASH(0x84708c8)
Ya no sé qué es lo que estoy haciendo mal :s.... cualquier ayuda con respecto al caso se agradece mucho.
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Publicidad

Re: Socket cliente servidor

Notapor explorer » 2010-01-28 14:59 @666

El problema creo que está en la línea 24 del servidor.

$client->enviar($client->select);

Estás indicando que quieres enviar algo, usando el canal abierto por select(), pero no indicas el mensaje a enviar.

Si vemos el código de enviar(), en la línea 49:

my ($message, $select) = @_;

Estás intentando leer un mensaje y el $select, pero en realidad, en $message acaba la instancia del objeto $client. Y eso es lo que ves en pantalla.

Como el $message lo tienes definido en la línea 7 del paquete Hola, supongo que entonces será una constante que querrás usar después.

En ese caso, lo que hay que hacer es modificar la línea 49 a

my ($self, $select) = @_;
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: Socket cliente servidor

Notapor panterozo » 2010-02-01 14:31 @647

Muchas gracias... resuelto
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Socket cliente servidor

Notapor salva » 2010-02-02 03:30 @187

panterozo escribiste:Muchas gracias... resuelto

De todas formas, para hacer servidores tienes Net::Server que te simplifica bastante la vida.
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 27 invitados