• Publicidad

non-blocking sockets

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

non-blocking sockets

Notapor SaToNiO » 2006-01-14 19:33 @856

Código: Seleccionar todo
use IO::Socket::INET;

$remote_host1="irc.red-futura.org";
$remote_port1=6667;

$socket = IO::Socket::INET->new(PeerAddr => $remote_host1,
                                PeerPort => $remote_port1,
                                Proto    => "tcp",
                                Type     => SOCK_STREAM)
    or die "No pudo conectar \$socket : $! \n";


print $socket "USER weeee weeee weeee :el puto clon conectao dsd perl\nNICK elclonillo\n";

$sock2 = IO::Socket::INET->new(PeerAddr => "irc.irc-hispano.org",
                                PeerPort => 6667,
                                Proto    => "tcp",
                                Type     => SOCK_STREAM)
    or die "No pudo conectar \$sock2 : $! \n";

print $sock2 "USER weeee weeee weeee :el puto clon conectao dsd perl\nNICK elclonillo2\n";



$socket -> blocking(0);
$sock2  -> blocking(0);
# estas lineas son



$leer="";
$leer2="";
while (1) {
  $leer = <$socket>;
  $leer2 = <$sock2>;
  unless ($leer eq "") {
   chop($leer);
   @read=split(/ /,$leer);
   if (($read[1] eq "376") || ($read[1] eq "422")) {
      print $socket "join #hattrick\n";
   }
   if ($read[0] eq "PING") {
      print $socket "pong $read[1]\n";
   }
   if ($read[1] eq "PRIVMSG") {
      @nick=split(/!/,$read[0]);
      @nick=split(/:/,$nick[0]);
      $nick=$nick[1];
      if ("\L$nick" eq "satonio") {
         if ($read[3] eq ":!haz") {
            $orden="";
            for ($i=4;defined($read[$i]);$i++) {
               $orden="$orden $read[$i]";
            }
            print $socket $orden;
         }
      }
   }
   print "\$leer = $leer\n";
   $leer="";
  }
  unless ($leer2 eq "") {
   chop($leer2);
   @read=split(/ /,$leer2);
   if (($read[1] eq "376") || ($read[1] eq "422")) {
      print $sock2 "join #hattrick\n";
   }
   if ($read[0] eq "PING") {
      print $sock2 "pong $read[1]\n";
   }
   if ($read[1] eq "PRIVMSG") {
      @nick=split(/!/,$read[0]);
      @nick=split(/:/,$nick[0]);
      $nick=$nick[1];
      if ("\L$nick" eq "satonio") {
         if ($read[3] eq ":!haz") {
            $orden="";
            for ($i=4;defined($read[$i]);$i++) {
               $orden="$orden $read[$i]";
            }
            print $sock2 $orden;
         }
      }
   }
   print "\$leer2 = $leer2\n";
   $leer2="";
  }
}


en windows no va lo de ponerlo en non-blocking pero en ubuntu si, alguien sabe k puedo hacer pa k vaya en windows

si lo preferis se puede mirar el codigo coloreao http://pastebin.com/506062
SaToNiO
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-01-14 19:23 @849

Publicidad

Notapor Perl user » 2006-01-15 00:37 @067

Los tópicos de red siempre son dependientes de la plataforma lamentablemente, y según parece quieres hacer un bot para IRC, por qué no usar algo existente o aprender de técnicas utilizadas en ese proyecto?

Yo siempre opto por utilizar frameworks basados en eventos, ya que te permite un mejor control ( incluso cuando están basados en threads ) de las acciones.

Te recomiendo utilizar POE::Component::IRC ( puedes ver ejemplos en el POE Cookbook ), un componente del framework POE que te permite escribir aplicaciones para IRC con una modalidad orientada a eventos, muy sencillo de controlar. En segundo término te recomiendo utilizar Net::IRC.

Te voy a decir las primeras problemáticas que tienes en tu código:

1) No manejas CR/LF/CRLF correspondientemente a la plataforma.
2) No es portable tu código por eso no funciona de la misma manera en ambas plataformas.
3) El hecho de decir "Non-blocking" no es para Windows es incorrecto, el término non-blocking IO se utiliza para decir que un recurso no espera a que se liberen los recursos que utiliza, éste queda listo para utilizarse en cuanto es llamado.
4) De nuevo el código no es portable ni muy Perlesco que digamos :)

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor SaToNiO » 2006-01-15 07:20 @347

esto es un ejercicio simple para probar el funcionamiento d las cosas en perl, ya k soy nuevo utilizandolo. el problema es k no m hace ni caso windows cuando pasa por las lineas resaltadas.

¿como lo se? borro esas lineas en linux y sale el mismo resultado k cuando lo hago andar en windows, ademas de otras muchas pruebas que no voy a describir, por lo que dudo muchisimo k el problema sea de los CR/LF/CRLF

Que no sea muy perlesco eso sera verdad, soy nuevo utilizando perl, no te voy a decir que no. Lo de que no es portable, si es por los citados CR/LF/CRLF ya te digo que no creo que sea el problema, y si es otra cosa, te agradeceria que me lo dijeras.
SaToNiO
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-01-14 19:23 @849

Re: non-blocking sockets

Notapor explorer » 2006-01-15 07:29 @353

Pregunta... ¿Has comprobado que el XP no esté filtrando esos puertos? ¿O no estarán filtrados por el cortafuegos/antivirus tuyo?
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

Notapor SaToNiO » 2006-01-15 07:41 @362

no tengo puesto nada que actue ahi, pero aunque lo tuviese lo que no va son esas dos lineas en el xp, no el resto que es donde abro conexiones, mando datos y los recibo.
SaToNiO
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-01-14 19:23 @849

Re: non-blocking sockets

Notapor explorer » 2006-01-15 08:42 @404

Todo lo que he encontrado me remite a lo mismo: Win32 NO tiene soporte para el modo no bloqueante de los sockets:
http://bugs.activestate.com/cgi-bin/bug ... i?id=14560
http://brebiou.cshl.edu/viewcvs/mpc/sit ... v=1.2#ch13
Lo que me sorprende es que estemos en el 2006 y todo esto venga de antes del 2001...

Aquí lo tienes mucho mejor explicacado:
http://poe.perl.org/?POE_RFCs/Windows_N ... patibility

Naturalmente, google encontrarás mucho más enlaces:
http://www.google.es/search?hl=es&q=PER ... ueda&meta=

Quizás la solución sea tan sencilla como esta:
Código: Seleccionar todo
use POSIX;
fcntl($sock, F_SETFL(), O_NONBLOCK());

pero yo no la he probado.
Lo que sí he leído es que el socket hay que ponerlo en modo "overlapped IO":
http://bugs.activestate.com/cgi-bin/bug ... i?id=14518
pero ya no estoy seguro de cómo se puede hacer...

Prueba a utilizar este módulo: Net::Socket::NonBlock, que parece que está diseñado precisamente para eso.

El enlace definitivo sería este, donde, aparte de haber alguien que también está haciendo un irc, al final se dan unas cuantas soluciones para solventar esto.
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

Notapor Perl user » 2006-01-15 13:24 @600

SaToNiO escribiste:esto es un ejercicio simple para probar el funcionamiento d las cosas en perl, ya k soy nuevo utilizandolo. el problema es k no m hace ni caso windows cuando pasa por las lineas resaltadas.

¿como lo se? borro esas lineas en linux y sale el mismo resultado k cuando lo hago andar en windows, ademas de otras muchas pruebas que no voy a describir, por lo que dudo muchisimo k el problema sea de los CR/LF/CRLF

Que no sea muy perlesco eso sera verdad, soy nuevo utilizando perl, no te voy a decir que no. Lo de que no es portable, si es por los citados CR/LF/CRLF ya te digo que no creo que sea el problema, y si es otra cosa, te agradeceria que me lo dijeras.


Creo que no entendiste mi post, mi respuesta fué general, dije que es necesario manejar correctamente la parte de CR/LF no obstante tu "creas" que no es necesario.

Sobre tu problema principal te hice un par de recomendaciones ( obviamente módulos que hacen caso a las recomendaciones que te hice ) y te hice incapié de que problemas de NBIO son cuestiones dependientes de la plataforma, y que hay módulos que tienen un "workaround" muy bueno para solucionarlo, y el mejor te indiqué que es POE::Component::IRC.

explorer escribiste:Todo lo que he encontrado me remite a lo mismo: Win32 NO tiene soporte para el modo no bloqueante de los sockets:
http://bugs.activestate.com/cgi-bin/bug ... i?id=14560
http://brebiou.cshl.edu/viewcvs/mpc/sit ... v=1.2#ch13
Lo que me sorprende es que estemos en el 2006 y todo esto venga de antes del 2001...


Como indiqué anteriormente, es obvio que Windows no maneja NBIO y a su vez trabaja muy poco async/IO, comenté también que siempre los problemas de red son dependientes de la plataforma y que hay buenos workarounds para ello.

Uno de los posts del foro comenté sobre uno de los flaws de Perl sobre el manejo de sockets y cuestiones de bits.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924


Volver a Intermedio

¿Quién está conectado?

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

cron