Página 1 de 1

Socket - Escuchar, aceptar, leer, y enviar datos

NotaPublicado: 2015-01-01 21:54 @954
por primitivo
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.

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

NotaPublicado: 2015-01-03 15:34 @690
por primitivo
Solucionado.

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

NotaPublicado: 2015-01-03 19:40 @861
por explorer
¿Y cómo?

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

NotaPublicado: 2015-01-03 22:34 @982
por primitivo
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

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

NotaPublicado: 2015-01-04 07:50 @368
por explorer
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.

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

NotaPublicado: 2015-01-04 17:06 @754
por primitivo
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.