• Publicidad

Problemas con OO y Socket

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Problemas con OO y Socket

Notapor creating021 » 2007-02-11 11:06 @504

Etoy creando un módulo que usa Socket y en una parte hago esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#...
*Socket;
socket(*Socket, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or croak("Socket: $!");
$class->{Socket} = *Socket;
#resuelve y todo eso sin problema.
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Luego, lo llamo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub Algo {
  my $class = shift;
  send($class->{Socket}, "Hola\n", 0) or corak ("send error: $!");
  while (my $linea = $class->{Socket} ){
    print $linea, "\n";
  }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero por alguna razón me imprime el puntero, como si estuviera usando ref o algo así :?

¿Alguna idea?

Gracias.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Notapor kidd » 2007-02-11 23:37 @025

El problema es que debes de pasar la referencia del socket, cambia la línea que dice:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$class->{Socket} = *Socket;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


por

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$class->{Socket} = \*Socket;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Problemas con OO y Socket

Notapor Perl user » 2007-02-11 23:58 @040

creating021 escribiste:Etoy creando un módulo que usa Socket y en una parte hago esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#...
*Socket;
socket(*Socket, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or croak("Socket: $!");
$class->{Socket} = *Socket;
#resuelve y todo eso sin problema.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Luego, lo llamo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub Algo {
  my $class = shift;
  send($class->{Socket}, "Hola\n", 0) or corak ("send error: $!");
  while (my $linea = $class->{Socket} ){
    print $linea, "\n";
  }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero por alguna razón me imprime el puntero, como si estuviera usando ref o algo así :?

¿Alguna idea?

Gracias.


Woah!!!

Quién te dijo que usaras esa nomenclatura? para qué necesitas un typeglob y almacenar allí el socket?

Hasta donde recuerdo, ni perldoc perlipc dice que lo hagas así y pasarlo como parámetro de esa manera. Eso se utilizaba hace años porque los handles con variables léxicas no era permitido (hablo de antes de 5.6). Así que mejor utiliza algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
socket($sock, ...., .....) or ...;
$obj->{socket} = $sock;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por cierto, te recomiendo que profundices un poco mas sobre objetos en Perl porque al parecer tienes pensado que pasas una clase como parámetro a un método (o al menos eso veo en tu ejemplo arriba), y lo que realmente pasas es un "objeto" (Sin hablar en el sentido estricto).

Por cierto.... tampoco son "punteros", no hay "punteros" en Perl.

Y como nota personal, te recomiendo que mejor le eches un vistazo a IO::Socket.

Saludos,[/syntax]
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 creating021 » 2007-02-12 15:35 @691

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
socket($sock, ...., .....) or ...;
$obj->{socket} = $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así imprime (en el otro código) GLOB(0x81495a0)

Con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$class->{Socket} = \*Socket;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
las cosas no son muy distintas (GLOB(0x81bd1a8))

Creo que el problema esta en el while de Algo(), hmmm :( tendré que intentar usando recv :(

Gracias por los comentarios. :D

PD: IO::Socket me gusta mucho, pero para lo que voy hacer no me sirve (este programa de por si será grande y lo tengo que "compilar" con PAR)
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor Perl user » 2007-02-12 16:32 @730

creating021 escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
socket($sock, ...., .....) or ...;
$obj->{socket} = $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así imprime (en el otro código) GLOB(0x81495a0)

Con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$class->{Socket} = \*Socket;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
las cosas no son muy distintas (GLOB(0x81bd1a8))

Creo que el problema esta en el while de Algo(), hmmm :( tendré que intentar usando recv :(

Gracias por los comentarios. :D

PD: IO::Socket me gusta mucho, pero para lo que voy hacer no me sirve (este programa de por si será grande y lo tengo que "compilar" con PAR)


Creo que no comprendiste mi comentario y la corrección del código, usando una variable léxica ya no hay el problema de los typeglobs, pero bueno.

Por cierto, recv es para URGENT DATA principalmente, vas a usar algo al respecto?

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 creating021 » 2007-02-12 17:20 @764

No, no es para URGENT DATA.

También creo que no te he comprendido, lo he usado con variable pero me sigue saliendo lo mismo... GLOB(...) que es (*MyModulo::Algo::$socket) pero no lo puedo usar como un File_Handled.

Qué estaré haciendo de mal?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Avanzado

¿Quién está conectado?

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