2009-12-10 15:26 @685 |
|
|
arnedis
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 
| Última edición por explorer el 2009-12-10 15:33 @689, editado 1 vez en total |
| Ortografía, anglicismos |
|
2009-12-10 17:38 @777 |
|
|
arnedis
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. Using perl Syntax Highlighting #!/usr/bin/perl
use IO::Socket;
use Socket;
print "content-type: text/html \n\n";
$Sock2 = new IO::Socket::INET(
PeerPort=>12000,
Proto=>'tcp',
PeerAddr=>'192.168.2.114',
Blocking=>0);
print "<body>\n";
print $Sock2 "Consulta";
print <$Sock2>;
print "ss";
print "</body>";
close($Sock2);
| Última edición por explorer el 2009-12-10 17:52 @786, editado 1 vez en total |
| Tildes, bloques de código |
|
2009-12-10 18:25 @809 |
|
|
arnedis
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 |
|
2009-12-10 18:33 @814 |
|
|
arnedis
Perlero Nuevo
|
Registrado: 2009-12-10 15:12 @675 Mensajes: 10
|
|
|
Re: Blocking
|
Te pregunto algo... ¿esto tiene algo de malo? 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 |
|
2009-12-10 18:51 @827 |
|
|
 |
explorer
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
|
2009-12-10 19:11 @841 |
|
|
arnedis
Perlero Nuevo
|
Registrado: 2009-12-10 15:12 @675 Mensajes: 10
|
|
|
Re: Blocking
|
|
Muchas gracias, voy a mirar el enlace que me sugeriste.
|
2009-12-10 19:46 @865 |
|
|
arnedis
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... Using perl Syntax Highlighting #!/usr/bin/perl -w
# server2way.pl - a server that reads from
# and writes to a client
use strict; #me parece q este es el problema.........
use IO::Socket;
use Sys::Hostname;
my $sock = new IO::Socket::INET(
PeerAddr=>'192.168.2.114', #aca le saque el localhost y le puse la IP de la pc con windows
LocalPort => 12000, #este es el puerto q escucha el programa en windows
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1);
$sock or die "no socket :$!";
STDOUT->autoflush(1);
my($new_sock, $buf);
while ($new_sock = $sock->accept()) {
# got a client connection, so read
# line by line until end-of-file
while (defined($buf = <$new_sock>)) {
# respond to client request using
# a cleverly disguised switch
# statement
foreach ($buf) {
print($new_sock
"Consulta", #aca le envio la consulta para que me diga que hora es en la pc con windows
"\n"),
last;
# default case:
print <$new_sock>; #si no te anda asi proba poner esto"DEFAULT\n" con comillas y saca <> quedaria algo asi: $new_sock "DEFAULT\n"
}
}
close $new_sock;
}
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 
|
2009-12-11 10:53 @495 |
|
|
arnedis
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. Using perl Syntax Highlighting #!/usr/bin/perl -w
# client2way.pl - a client that writes to
# and reads from a server
use strict;
use IO::Socket;
print "content-type: text/html \n\n";
my $host = shift || '192.168.2.114';
my $port = shift || 12000;
my $sock = new IO::Socket::INET(
Blocking=>1,
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp');
# send message to server
print $sock "Consulta";
print scalar <$sock>;
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.
|
2009-12-11 11:09 @506 |
|
|
arnedis
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?
|
2009-12-11 11:15 @510 |
|
|
 |
explorer
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
|
2009-12-11 11:53 @537 |
|
|
arnedis
Perlero Nuevo
|
Registrado: 2009-12-10 15:12 @675 Mensajes: 10
|
|
|
Re: Blocking
|
Using perl Syntax Highlighting #!/usr/bin/perl -w
# client2way.pl - a client that writes to
# and reads from a server
use strict;
use IO::Socket;
$|++;
print "content-type: text/html \n\n";
my $host = shift || '192.168.2.114';
my $port = shift || 12000;
my $sock = new IO::Socket::INET(
Blocking=>1,
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp');
$sock->autoflush(1);
# send message to server
print $sock "Consulta";
print scalar <$sock>;
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 |
|
| 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
|
|
Socializa |
 |
|