Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Blocking Responder al tema
Nuevo tema


Página 1 de 2  [ 18 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2009-12-10 15:26 @685

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Blocking
Hola. Mi nombre es Cristian y soy bastante nuevo en esto... mi problema es que he buscado por la Internet un problema que me surge...
Cuando intento enviar información desde Ubuntu a un servidor en Windows lo hace correctamente, pero éste me tiene que responder algo, pero no lo hace...
He comprobado que se comunica porque el servidor en Windows cuando desde Linux le digo "Cambiarhora" éste me cambia la hora de Linux y la sincroniza con la de Windows pero aparte de eso el servidor me tiene que decir "Changed" y yo a ese "Changed" lo tengo que mostrar en una página web... pero el problema es cuando quiero mostrar ese "Changed" porque el Mozilla (en Linux) se queda esperando al localhost... ya intenté poner el socket como blocking => 0 y en 1 también probé pero nada... ¡¡¡Alguien que me ayude, please!!! Gracias de antemano :twisted: :twisted: :twisted:


Última edición por explorer el 2009-12-10 15:33 @689, editado 1 vez en total
Ortografía, anglicismos


Nota 2009-12-10 15:56 @705
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Blocking
Bienvenido a los foros de Perl en Español, arnedis.

Parece que se trata de un intercambio de información entre servidor y cliente usando el protocolo HTTP, lanzando un CGI, del que esperas una respuesta. Si no aparece, es quizás porque el servidor no termina de enviar la respuesta o que el CGI no termina de enviar la información al servidor web.

Habría que ver si, efectivamente, el CGI termina correctamente.

La solución: en los ficheros de registro (log) del servidor web.

_________________
JF^D Perl programming


Nota 2009-12-10 17:38 @777

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Este es el código de mi script. Lo raro es que cuando cierro el server en Windows, en Linux me muestra la respuesta... lo bueno sería que me muestre tal respuesta sin tener que cerrar dicho server... Gracias por tu dedicación.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. use Socket;
  4. print "content-type: text/html \n\n";
  5.  
  6. $Sock2 = new  IO::Socket::INET(
  7.         PeerPort=>12000,
  8.         Proto=>'tcp',
  9.         PeerAddr=>'192.168.2.114',
  10.         Blocking=>0);
  11. print "<body>\n";
  12. print $Sock2 "Consulta";
  13. print <$Sock2>;
  14. print "ss";
  15. print "</body>";
  16. close($Sock2);


Última edición por explorer el 2009-12-10 17:52 @786, editado 1 vez en total
Tildes, bloques de código


Nota 2009-12-10 17:54 @787
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Blocking
No me entero... ¿ese código qué es? ¿el cliente que ataca al servidor? ¿el CGI que está en el servidor y que a su vez ataca a otro?

_________________
JF^D Perl programming


Nota 2009-12-10 18:25 @809

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Es el cliente que ataca al servidor que está escuchando en el puerto 1200... yo tengo 2 opciones:
1- Preguntarle la hora
2- Cambiar la hora
En este caso le mando "Consulta" para mostrar la hora de la computadora que tiene Windows en la página que tengo en Linux.


Última edición por explorer el 2009-12-10 18:37 @817, editado 1 vez en total
Ortografía, anglicismos, abreviaturas telefónicas


Nota 2009-12-10 18:28 @811
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Blocking
Pero, no estamos hablando de un protocolo HTTP, ¿verdad?

Lo digo porque veo que ese cliente se conecta a un servidor y le envía un text/html y espera un resultado, pero todo está mezclado... Incluso el Content-type del principio, no va a ningún sitio: solo sale en pantalla.

_________________
JF^D Perl programming


Nota 2009-12-10 18:33 @814

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Te pregunto algo... ¿esto tiene algo de malo?

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$Sock2 = new  IO::Socket::INET(

        PeerPort=>12000,

        Proto=>'tcp',

        PeerAddr=>'192.168.2.114',

        Blocking=>0);

print $Sock2 "Consulta";

print <$Sock2>;


Última edición por explorer el 2009-12-10 18:42 @821, editado 1 vez en total
Bloques de código


Nota 2009-12-10 18:51 @827
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Blocking
No, no hay nada raro, salvo que estás primero enviando la consulta y luego esperando la respuesta.

La clave de un protocolo hecho a medida es que tienen que hablar perfectamente bien cliente y servidor.

El mejor ejemplo que se me ocurre e idéntico a lo que estás haciendo, está en la famosísima página de Linux Journal 1999/04/01. En concreto, tienes un ejemplo de servidor en el listado 5 y de cliente en el listado 6. Míralos y verás que son casi iguales a lo que quieres hacer.

Actualización: Fíjate que el intercambio de mensajes usan "\n" al final. Por eso pueden hacer <$sock>, porque eso implica la presencia de caracteres de fin de línea.

_________________
JF^D Perl programming


Nota 2009-12-10 19:11 @841

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Muchas gracias, voy a mirar el enlace que me sugeriste.


Nota 2009-12-10 19:46 @865

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Hola... sigo con problemas... perdón por ser tan molesto.

Ahora mi problemita es que me tira un erroraso, ¡ja,ja!... te muestro cómo quedó mi código después de modificarlo...

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. # server2way.pl - a server that reads from
  3. # and writes to a client
  4. use strict; #me parece q este es el problema.........
  5. use IO::Socket;
  6. use Sys::Hostname;
  7. my $sock = new IO::Socket::INET(
  8.                    PeerAddr=>'192.168.2.114', #aca le saque el localhost y le puse la IP de la pc con windows
  9.                    LocalPort => 12000, #este es el puerto q escucha el programa en windows
  10.                    Proto     => 'tcp',
  11.                    Listen    => SOMAXCONN,
  12.                    Reuse     => 1);
  13. $sock or die "no socket :$!";
  14. STDOUT->autoflush(1);
  15. my($new_sock, $buf);
  16. while ($new_sock = $sock->accept()) {
  17.     # got a client connection, so read
  18.     # line by line until end-of-file
  19.     while (defined($buf = <$new_sock>)) {
  20.    # respond to client request using
  21.    # a cleverly disguised switch
  22.         # statement
  23.    foreach ($buf) {
  24.                  print($new_sock
  25.                        "Consulta", #aca le envio la consulta para que me diga que hora es en la pc con windows
  26.                        "\n"),
  27.                  last;
  28.        # default case:
  29.        print <$new_sock>; #si no te anda asi proba poner esto"DEFAULT\n" con comillas y saca <> quedaria algo asi: $new_sock "DEFAULT\n"
  30.    }
  31.     }
  32.     close $new_sock;
  33. }


Probé usando lo del content text/html y sin él... ¿tienes idea de qué puede llegar a ser el problemita? Estoy muy agradecido por tu ayuda :D


Nota 2009-12-11 04:53 @245
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Blocking
Por favor, sería muy ilustrativo saber el contenido del error que te muestra.

El problema de este código es que no envía "Consulta" hasta haber recibido algo desde el servidor.

_________________
JF^D Perl programming


Nota 2009-12-11 10:53 @495

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Hola. Ya pude solucionar mi problema... era un error de sintaxis. Ahora este es mi nuevo código después de haber visitado lo que me mandaste y de haber pulido todo un poco.
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. # client2way.pl - a client that writes to
  4.  
  5. # and reads from a server
  6.  
  7. use strict;
  8.  
  9. use IO::Socket;
  10.  
  11. print "content-type: text/html \n\n";
  12.  
  13.  
  14. my $host = shift || '192.168.2.114';
  15.  
  16. my $port = shift || 12000;
  17.  
  18. my $sock = new IO::Socket::INET(
  19.                  
  20.  
  21.                   Blocking=>1,
  22.  
  23.                   PeerAddr => $host,
  24.  
  25.                   PeerPort => $port,
  26.  
  27.                   Proto    => 'tcp');
  28.  
  29. # send message to server
  30.  
  31.  
  32.  
  33. print $sock "Consulta";
  34.  
  35. print scalar <$sock>;
  36.  
  37. close $sock;


El tema es este:
Cuando abro esta página se queda esperando a localhost... Cuando cierro el server en Windows me muestra en Linux la consulta... La idea es que me muestre la hora sin tener que cerrar dicho server... Gracias.


Nota 2009-12-11 11:09 @506

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Creo que omití un detalle... el server en Windows está hecho en Visual Basic... o en Visual Studio... ¿puede llegar a ser este el problema?


Nota 2009-12-11 11:15 @510
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Blocking
Bien... la pregunta esencial se refiere a cómo es el protocolo...

* Tienes que enviar la palabra 'Consulta', pero, ¿es "Consulta" o "Consulta\n"? Tal como lo tienes ahora, estás enviando "Consulta".

* Por lo mismo, el servidor, cuando responde, ¿lo hace con un texto terminado en un carácter fin de línea?

* Además, ¿hay más comunicaciones a partir de ese momento?

Veo en la documentación de que IO::Sockect::INET de que a partir de la versión 1.18 viene con el autoflush() activado por defecto. Si no te fías, ponle

$sock->autoflush(1);

justo después de haber creado el objeto. Pon también

$|++;

al principio del programa, para hacer el autoflush también en la salida estándar.

El hecho de que el texto no salga hasta que cierras el servidor, es que éste sí que ha enviado el texto al Linux, pero el cliente en Linux no se ha enterado de que ha terminado de llegar el mensaje. Esto es lo que sucede cuando el servidor envía algo, pero el cliente espera algo que esté terminado en un carácter de fin de línea. En tu programa tienes puesto:

print scalar <$sock>;

Esa línea espera por un texto enviado por el $sock, que esté terminado en un carácter fin de línea. No te olvides de poner el $|++;.

El que esté hecho en Visual Basic, no importa, si está claro el protocolo. Eso quiere decir que tenemos que tener muy claros qué bytes se intercambian entre sí.

Actualización: el print() del Content-type no te sirve para nada, si ejecutas el programa desde la línea de comandos... porque ¿estás ejecutando el programa Perl desde la línea de comandos, verdad?

_________________
JF^D Perl programming


Nota 2009-12-11 11:53 @537

Perlero Nuevo
Registrado: 2009-12-10 15:12 @675
Mensajes: 10
Re: Blocking
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. # client2way.pl - a client that writes to
  4.  
  5. # and reads from a server
  6.  
  7. use strict;
  8.  
  9. use IO::Socket;
  10. $|++;
  11. print "content-type: text/html \n\n";
  12.  
  13.  
  14. my $host = shift || '192.168.2.114';
  15.  
  16. my $port = shift || 12000;
  17.  
  18. my $sock = new IO::Socket::INET(
  19.  
  20.                   Blocking=>1,
  21.  
  22.                   PeerAddr => $host,
  23.  
  24.                   PeerPort => $port,
  25.  
  26.                   Proto    => 'tcp');
  27. $sock->autoflush(1);
  28.  
  29. # send message to server
  30.  
  31.  
  32.  
  33. print $sock "Consulta";
  34.  
  35. print scalar <$sock>;
  36.  
  37. close $sock;



Ahora me quedo así... probé con "Consulta\n" y el server, luego de cerrarlo me dice "No entiendo!" entonces le saqué el "\n"... sigue esperando al localhost. Gracias.

Actualización: Ejecuto desde el Mozilla Firefox mi cliente por eso uso el content


Última edición por explorer el 2009-12-11 13:22 @598, editado 1 vez en total
Ortografía


Responder al tema  [ 18 mensajes ]  Ir a página 1, 2  Siguiente

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO