• Publicidad

Socket - Escuchar, aceptar, leer, y enviar datos

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

Socket - Escuchar, aceptar, leer, y enviar datos

Notapor primitivo » 2015-01-01 21:54 @954

Un saludo, ayúdenme con una cosita.

Estoy intentando crear un 'servidor' para escuchar conexiones desde un 'cliente'.

Básicamente, lo que hago en pedir la conexión por el puerto 3220 del servidor local y escuchar las conexiones, en el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use POSIX;
  4. use IO::Socket;
  5. use IO::Select;
  6. use Socket;
  7.  
  8.  
  9. my $s = IO::Socket::INET->new(LocalPort=>3220,Proto=>'tcp',Reuse=>1,Listen=>1,Type=>SOCK_STREAM) or print "ERROR: $!\n";
  10. $select = IO::Select->new($s);
  11.  
  12. for (;;) {
  13.         foreach $cliente ($select->can_read(1)) {
  14.                 if ($cliente == $server) {
  15.                         $cliente = $server->accept();
  16.                         $select->add($cliente);
  17.                 }
  18.                 else {
  19.                         $rv = $cliente->recv($data, POSIX::BUFSIZ, 0);
  20.                         print $rv . "->" . $data . "\n";
  21.                         last;
  22.                 }
  23.         }
  24. }
  25.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Pero no logro obtener los datos que manda el 'cliente'.

NOTA: La conexión al 'servidor' la efectúo desde un cliente IRC. Quiero obtener los datos de registro, como 'NICK', 'USER', etc.

Gracias de antemano.
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Publicidad

Re: Socket - Escuchar, aceptar, leer, y enviar datos

Notapor primitivo » 2015-01-03 15:34 @690

Solucionado.
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Socket - Escuchar, aceptar, leer, y enviar datos

Notapor explorer » 2015-01-03 19:40 @861

¿Y cómo?
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: Socket - Escuchar, aceptar, leer, y enviar datos

Notapor primitivo » 2015-01-03 22:34 @982

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (;;) {
  2.     my $client;
  3.     my $rv;
  4.     my $data;
  5.     foreach $client ($select->can_read(1)) {
  6.  
  7.         if ($client == $server) {
  8.             #Una nueva conexión
  9.             $client = $server->accept();
  10.  
  11.             $select->add($client);
  12.             nonblock($client);
  13.         } else {
  14.             #Veamos si nos chivan algo :D
  15.             $data = '';
  16.             $rv   = $client->recv($data, POSIX::BUFSIZ, 0);
  17.  
  18.             unless (defined($rv) && length $data) {
  19.                 #Si no hay nada, pues nada... caña XD
  20.                 delete $inbuffer{$client};
  21.                 delete $outbuffer{$client};
  22.                 delete $ready{$client};
  23.  
  24.                 $select->remove($client);
  25.                 close $client;
  26.                 next;
  27.             }
  28.  
  29.             $inbuffer{$client} .= $data;
  30.             #Paso a verificar si existe alguna petición...
  31.             while ($inbuffer{$client} =~ s/(.*\n)//) {
  32.                 push( @{$ready{$client}}, $1 ); #Agregamos la petición a la cola
  33.             }
  34.         }
  35.     }
  36.     foreach $client (keys %ready) {
  37.         #handle($client);
  38.         #Leemos lo que se nos envia.
  39.     }
  40.     foreach $client ($select->can_write(1)) {
  41.           $client->send("Me aseguro que puedo enviar info\n", 0);
  42.     }
  43. }
  44.  
  45. sub handle {
  46.     my $client = shift; #Quien conecta
  47.     my $request; #Lo que nos chiva
  48.  
  49.     foreach $request (@{$ready{$client}}) {
  50.         chomp $request;
  51.         cmds($client, $request); #Aqui busco los comandos.
  52.     }
  53.     delete $ready{$client};
  54. }
  55. sub cmds {
  56.  
  57.     my ($client, $request) = @_;
  58.     print $request . "\n";
  59.  
  60.     if ($ping_user{$client} < 1) {
  61.       $client->send(":irc.pruebas.org NOTICE IP_LOOKUP :*** Verificando la conexión.\n",0);
  62.       $client->send(":irc.pruebas.org NOTICE IP_LOOKUP :*** Escaneando...\n",0);
  63.       $client->send("PING :OK\n",0);
  64.       $ping_user{$client} = 1;
  65.     }
  66.     if (length($request) ne 0) {
  67.         chomp $request;
  68.         my @msg = split(" ", $request);
  69.         if($msg[0] eq 'PONG') {
  70.            msgping($client, @msg);
  71.         } elsif ($msg[0] eq 'NICK') {
  72.            register($client, @msg);
  73.         } elsif ($msg[0] eq 'USER') {
  74.            $users{$client}->{'ident'} = parse($msg[1]);
  75.            $users{$client}->{'localhost'} = parse($msg[2]);
  76.            $users{$client}->{'ip_host'} = parse($msg[3]);
  77.            $users{$client}->{'realname'} = substr($request,index($request,":")+1,length($request)-index($request,":"));
  78.            $users_record++;
  79.  
  80.         }
  81.     }
  82. }
  83. sub msgping {
  84.   my($client,$msg) = @_;
  85.   $client->send("Vale, reconocido\n",0);
  86. }
  87.  
  88. sub parse {
  89.   my($parsed) = shift;
  90.   $parsed =~ s/\"//g;
  91.   return $parsed;
  92. }
  93.  
  94. #Me aseguro que lo que reciba a travez de 'NICK'
  95. #Sea en formato 'NICK :apodo' ó 'NICK :apodo:pass' ó 'NICK :apodo!pass'
  96. sub parse_comodin {
  97.   my($parseado) = shift;
  98.   $parseado =~ s/^://;
  99.   if ($parseado =~ /^([a-zA-Z0-9]+):([a-zA-Z0-9]+)$/) {
  100.     return 1;
  101.   } elsif ($parseado =~ /^([a-zA-Z0-9]+)!([a-zA-Z0-9]+)$/) {
  102.     return 2;
  103.   } elsif ($parseado =~ /^([a-zA-Z0-9]+)$/) {
  104.     return 0;
  105.   }
  106. }
  107.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Socket - Escuchar, aceptar, leer, y enviar datos

Notapor explorer » 2015-01-04 07:50 @368

Son muchas líneas.

Por estos hilos hay algunos temas dedicados al IRC. Por ejemplo, hay uno llamado [IRC]Bot que responda. Ahí tengo un ejemplo hecho con Bot::BasicBot, que permite escribir bots de forma sencilla.

En MetaCPAN hay más, como por ejemplo Mojo::IRC.
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: Socket - Escuchar, aceptar, leer, y enviar datos

Notapor primitivo » 2015-01-04 17:06 @754

explorer escribiste:Son muchas líneas.

Por estos hilos hay algunos temas dedicados al IRC. Por ejemplo, hay uno llamado [IRC]Bot que responda. Ahí tengo un ejemplo hecho con Bot::BasicBot, que permite escribir bots de forma sencilla.

En MetaCPAN hay más, como por ejemplo Mojo::IRC.


Lo que yo estoy intentando, es pasar de los IRCD escritos en C, a Perl.
Gestionar las conexiones de los clientes, que me sugeriste en los ejemplos anteriores.
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004


Volver a Básico

¿Quién está conectado?

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

cron