• Publicidad

Ejecutar programa perl con Telnet

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

Ejecutar programa perl con Telnet

Notapor Josmanue » 2006-06-09 05:07 @255

Mi problema es el siguiente: Necesito hacer un programa que a través de puertos recoja datos y los envíe a una tabla de My SQL, tengo que hacerlo en Perl y soy novato con este lenguaje. A modo de prueba he hecho un simple programa "Hola mundo" que funciona mientras haya datos en <STDIN> que funciona a la perfeccion en local pero no por el Telnet.
Desde mi máquina 192.168.1.111 (en mi caso) abro sesion con el putty en otras dos máquinas de la red o en la misma 192.168.1.189, sesiones A y B.
En la Sesion A hago:
tcpserver -v -B Servidor_de_prueba 0 1056 ./prueba1.pl
dice: tcpserver: status: 0/40
con esto se supone que no tengo que preocuparme del tema de SOCKETs
En la Sesion B hago:
telnet 192.168.1.189 1056
conecta sin problemas y se queda esperando mientras en la sesión A detecta la conexion recien hecha.
En teoría ahora cualquier cosa que escribiera en la sesion B me debería devolver la frase "Hola mundo" ¿no? pues no lo hace, en realidad no hace nada, no se si no detecta el caracter de retorno de carro por telnet o no se muy bien cual puede ser el problema. Así que por favor, si alguien puede echarme una mano con esto.
GRACIAS!!!
Siento que sea tan largo pero quería explicarlo bien. Bye!
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Publicidad

Notapor explorer » 2006-06-09 06:21 @306

El módulo Net::Telnet te puede servir, si la comunicación entre los dos procesos es sencilla. Vete directamente a la sección de ejemplos, y mira a ver si te sirve alguno. Quizás con el primero. Fíjate que el programa puede dialogar con el servidor porque sabe en cada momento por lo que tiene que esperar (waitfor) para continuar.

Si ese no es el caso, hay que adoptar otra estrategia, como usar alguno de los módulos POE.

De todas formas, la solución más sencilla que encontré una vez fue instalar mi servidor como un proceso dependiente del inetd. El inetd se encarga de redirigir la salida y la entrada estandar del servidor a las del socket, por lo que entonces el servidor se realizó como si realmente estuviera escribiendo en pantalla y leyendo del teclado. En ese caso, utilicé el módulo IO::Socket.
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

Notapor Josmanue » 2006-06-26 01:52 @119

Lo primero gracias a explorer por responderme. Estos días he tenido que aparcar el tema un poco por otros problemas en la empresa, pero ya estoy aqui de nuevo.

He estado mirando la solución que me diste acerca de Net::Telnet pero no creo que vayan por ahi los tiros, esta solución creo que es desde el punto de vista cliente y yo necesito algo desde el punto de vista del servidor. El programa (alojado en el servidor) debe leer de un determinado puerto, dependiendo de la información mandarla a uno u otro programa, ver si hay algo para ese puerto y si lo hay mandarlo y si no pues cerrarlo. El problema es que no tengo ni idea de como va el tema de puertos, me dijero que con el tcpserver ya esta solucionado como he explicado en el articulo anterior.

Necesito ayuda urgentemente!!! por favor porque estoy totalmente bloqueado.

Muchas gracias de antemano. Espero vuestras respuestas.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-06-26 08:34 @399

A ver si lo entiendo...

Un programa queda escuchando en un puerto.
Según lo que reciba por ese puerto, tiene que ejecutar otro programa o cerrarlo.
¿no era dialogar con una base de datos?

Aquí http://www.linuxjournal.com/article/3237 tienes una introducción al sistema más básico de manejo en redes. Hay otras formas más modernas ahora para dialogar por puertos, pero antes quiero que me confirmes el párrafo anterior.

Quizás lo que más se parece a lo que necesitas está en el listado 8 del enlace anterior.
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

A ver me explico mejor

Notapor Josmanue » 2006-06-27 04:51 @244

El programa debe escuchar el puerto que diga el tcpserver, por el que le llegara una cadena de texto (procendente de alguna base de datos, o eso creo), ese es mi primer problema. Después deberá mandarlo a una base de datos MySQL alojada en el servidor.

La segunda parte sería la inversa, ver si hay algo en la base de datos del Servidor (Algun campo que haya sido actualizado o algo así que deba mandarse a la base de datos a la que esta escuchando por el puerto) y si lo hay mandarlo por el puerto aprovechando la conexión con la base de datos de origen y si no pues cerrar la conexion.

Vaya por lo que yo entiendo es como una sincronizacion de bases de datos que son incompatibles, sería leer de STDIN (el puerto) y mandar a STDOUT (Base de datos MySQL, ésta ya interpretará la cadena de texto) y viceversa.

como prueba hice el programa en perl:

#!/usr/bin/perl

while (STDIN)
{
print "Hola Mundo\n";
}

que escriba lo que escriba debe escribir "Hola Mundo" pero que no va cuando lo hago con el telnet.

En cambio uno muy parecido hecho sobre bash directamente si que funciona:

#!/usr/local/bin/bash

while read lines
do
echo $lines;
done
este repite lo que metas por teclado.
y no entiendo por qué éste funciona y el otro tan simple que he hecho en perl no. Puede tener algo que ver con el "\n"???

Espero que esté algo más claro y gracias por ayudarme.
Jose.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-06-27 05:57 @289

Yo no tengo el programa tcpserver, sino el tcpsvd.

El programa de Perl tiene dos errores clásicos:
* STDIN es el handle de la entrada estandar, pero para leerlo, hay que usar el operador diamante.
* Perl siempre tiene un buffer de salida. No imprimirá nada en la salida mientras el buffer no se llene. En comunicaciones de red, a veces esto es un problema...

Prueba con este programa, que a mi sí me ha funcionado:
Código: Seleccionar todo
#!/usr/bin/perl

$|++;
while (<STDIN>)
{
    print "Hola Mundo\n";
}
Con $|++ estamos quitando el buffer de salida, por lo que todos los print salen inmediatamente. Y luego en el while, usamos <> para leer desde STDIN.

Para hablar con la base de datos MySQL, si está en el mismo servidor que tu programa, yo usaría el módulo DBI, pero si no es así, usaría el Net::MySQL.
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

Notapor Josmanue » 2006-06-28 03:28 @186

Macho eres mi IDOLO!!!!

Muchisimas gracias, era del buffer. Voy a echarle un vistazo ahora a los módulos que me has dicho.... no te vayas muy lejos x si acaso je jeje!
Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231


Volver a Básico

¿Quién está conectado?

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