• Publicidad

Duda con sockets

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

Duda con sockets

Notapor BigBear » 2013-04-02 10:00 @458

Tengo el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use IO::Socket;
  2.  
  3. my $socket = new IO::Socket::INET(
  4. LocalHost => 'localhost',
  5. LocalPort => '8080',
  6. Proto => 'tcp',
  7. Listen => SOMAXCONN,
  8. Reuse => 1);
  9.  
  10. my ($cliente,$buff,$kid);
  11.  
  12. while ($cliente = $socket->accept())
  13. {
  14. next if $kid = fork;
  15.  
  16. while(<$cliente>) {
  17. $data.=$_;
  18. }
  19.  
  20. print $data;
  21.  
  22. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Me gustaría recibir la información en una sola variable porque no quiero usar el while(). Intenté usando $data.= de esta forma para poder mostrarlo después del while(), pero no funciona.

¿ Alguien me podría decir si hay alguna forma más fácil de hacerlo o sino decirme qué estoy haciendo mal ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Duda con sockets

Notapor explorer » 2013-04-02 13:06 @588

Pero, ¿qué tiene de malo un inocente while()? :lol:

Puedes hacerlo así:

$data = join '', <$cliente>;

pero, en realidad, el número de operaciones que harás, será el mismo.

Otra cosa es que sepas exactamente cuánta información vas a recibir. En ese caso, puedes usar read().
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: Duda con sockets

Notapor BigBear » 2013-04-02 13:14 @593

perdon me podrias dar un ejemplo con read porque la forma en la que la hago siempre esta mal :(

edito : lo edite antes de que lo respondieras :)
Última edición por BigBear el 2013-04-02 13:22 @598, editado 2 veces en total
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con sockets

Notapor explorer » 2013-04-02 13:17 @595

Sacado de perldoc -f read:

read IDENTIFICADOR_ARCHIVO,ESCALAR,LONGITUD;

read $cliente, $data, $longitud;

Naturalmente, antes debes saber el valor de $longitud.
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: Duda con sockets

Notapor BigBear » 2013-04-02 13:23 @599

Qué raro. Tu dos ejemplos me obligan a cargar dos veces la misma página para que este servidor me responda algo, pero cuando lo hago con while() anda sin ningún problema.

¿ Por qué será ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con sockets

Notapor explorer » 2013-04-02 14:36 @650

Estás hablando del protocolo HTTP, ¿no? pues entonces el servidor, si la petición está bien hecha, debería responder igual que cuando lo hacemos vía telnet:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ telnet google.es 80
Trying 173.194.45.31...
Connected to google.es.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 302 Found
Location: http://www.google.es/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=cfd42d6abe1b429c:FF=0:TM=1364931200:LM=1364931200:S=5QD7BQmDNI5igzN_; expires=Thu, 02-Apr-2015 19:33:20 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=kKrxPMYGcymisG5oWl7PEqEv2vP_MdscaXxCk1KqKXx5M7CCfsNiPXxVGCXshKbmpIcUehbkbGXtoaTHHNXqci_Fyyiad8d_RIsK1R_mLTdSBdWpfj5B0NkM8ymz6EID; expires=Wed, 02-Oct-2013 19:33:20 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/ ... wer=151657 for more info."
Date: Tue, 02 Apr 2013 19:33:20 GMT
Server: gws
Content-Length: 218
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.es/">here</A>.
</BODY></HTML>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
es decir, un conjunto de líneas. Por eso con while() funciona. Con read(), debes indicar el número de bytes que vas a leer. Y ese dato lo puedes sacar del Content-Length, por ejemplo.

Si vas a hablar con servidores HTTP, hay docenas de formas más sencillas...
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: Duda con sockets

Notapor The XC3LL » 2013-04-09 18:33 @815

No entiendo muy bien tu pregunta... ¿Quieres guardar todo lo que recibe dentro de una variable para después trabajar con ello? De ser así, lo que podrías hacer es en vez de usar .= es crear previamente un array y después "push()ear" las líneas que vas recibiendo del socket en su interior. Es decir:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<SOCKET>) {
  2.     push(@array,$_);
  3. };
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Después ya puedes trabajar con ello. Si no quieres después trabajar con el array y necesitas, por lo que sea, pasarlo a una variable tiras de join().
The XC3LL
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2013-03-24 15:04 @669


Volver a Básico

¿Quién está conectado?

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

cron