• Publicidad

Blocking

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Re: Blocking

Notapor explorer » 2009-12-11 04:53 @245

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 & 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

Publicidad

Re: Blocking

Notapor arnedis » 2009-12-11 10:53 @495

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.
Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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.
arnedis
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-12-10 15:12 @675

Re: Blocking

Notapor arnedis » 2009-12-11 11:09 @506

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?
arnedis
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-12-10 15:12 @675

Re: Blocking

Notapor explorer » 2009-12-11 11:15 @510

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 & 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: Blocking

Notapor arnedis » 2009-12-11 11:53 @537

Sintáxis: [ Descargar ] [ Ocultar ]
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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



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
Razón: Ortografía
arnedis
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-12-10 15:12 @675

Re: Blocking

Notapor explorer » 2009-12-11 13:28 @602

Si ejecutases este cliente desde la línea de comandos, tardarías la décima parte de tiempo en tener el tema terminado.

Cambia el text/html por text/plain, porque en tu programa no estás enviando ninguna salida en HTML.

Sí... es más cómodo abrir una terminal y hacer pruebas en ella, ejecutando este programa, hasta saber cómo conectarte con el servidor. Luego, pasarlo a CGI, que es lo que estás haciendo ahora, es casi trivial. Pero empezar siendo CGI... pues como que algunas cosas se pueden quedar escondidas.

Aún no has dicho nada de qué tipo de respuestas devuelve el servidor. Te he preguntado si lo que devuelve el servidor acaba en carácter de fin de línea o no, porque según lo que respondas, podrás usar <$sock> o read($sock, ...).
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: Blocking

Notapor arnedis » 2009-12-13 04:50 @243

Hola. Después de tanto tiempo... ¡ja,ja! Al final pude resolver mi problema... hice cambiar unos parámetros desde el server de Windows y ahora me funciona de pelos... te hago una consulta... ¿tenés por ahí alguna página en donde pueda averiguar cómo restar horas? Ejemplo:

Hora1=localtime(time);
Hora2="La consulta de la hora con el server de Windows"

Resultado= "Tiene que ser en segundos"


Estuve viendo algo... pero si por alguna casualidad tenés a mano algún link te lo agradecería.

Saludos, Arnedis.

Actualizacion: Hice mi propio script de las horas... en un rato las subo para los usuarios que tengan problemas de ese tipo.
Última edición por explorer el 2009-12-13 06:58 @332, editado 2 veces en total
Razón: Ortografía
arnedis
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2009-12-10 15:12 @675

Re: Blocking

Notapor explorer » 2009-12-13 07:31 @355

Con Time::Local puedes convertir una hora en segundos, por lo que luego es fácil hacer la diferencia.
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

Anterior

Volver a Web

¿Quién está conectado?

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