 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 22 Nov, 2008 6:44 pm Asunto: conectar a maquina linux |
|
|
Hola, quisiera un consejo, que no pido solución.
Tengo que hacer un programa que conecte a un aparato que tiene linux, para copiar o escribir algunos archivos (Backup/Restore). En otro post pregunté sobre telnet y no lo tengo claro.
El aparato está conectado por red, y solo desde red tengo acceso a el. Este aparato trabaja en modo consola linux.
La pregunta: ¿que componente creéis que es mejor para trabajar desde Builder?
Con telnet he conseguido algo, pero cuesta programar por que tienes que poner sleeps entre envíos y recepciones y comprobar cada vez si esta todo correcto.
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Vie 28 Nov, 2008 8:01 pm Asunto: |
|
|
Hola, hay varias formas basicas en una el sistema linux corre el demonio SAMBA el cual permite compartir archivos e impresoras con maquinas windows, en este caso puedes acceder al sistema de archivos como si lo hicieses con otra maquina windows, la otra forma es mediante un programa
que emula una consola linux de texto donde trabajas como si estubieses en
el propio servidor. Ahh ademas si esta instalado te puedes valer de ftp.
Puedes buscar algun programa tipo emulador de consola con codigo fuente
y mirar este para implementar los procedimientos que te interesen en tu programa. |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 28 Nov, 2008 8:50 pm Asunto: |
|
|
Gracias por tu respuesta, pero preguntaba que componente sería mejor y mas fácil de programar. Al final lo he hecho con TIdTelnet y funciona, aunque es un poco engorroso lo de estar esperando a recibir los datos y compararlos.
Para eso uso esta función
| Código: | Idglobal::Sleep(1000);
Application->ProcessMessages();
seguir:
if(ready==false){
Idglobal::Sleep(200);
Application->ProcessMessages();
goto seguir;
}
|
Y me salta un error cuando está compilado en modo release y ejecuta el processmesages 8 veces. Compilado en modo debug funciona correcto y sin poner breakpoints. Esta rutinita la hago para esperar a que el telnetDataAvailable de telnet recopile los caracteres y la maquina linux esté preparada para recibir comandos. En ese momento pone ready a true. Si no está el processmessages, jamás llega a entrar en la funcion telnetDataAvailable.
Mi pregunta: ¿Porque da el error de access violation? se supone que si no hay mensajes pendientes no debe hacer nada ¿o es fallo del windows?
¿Hay alguna otra forma de hacer esperar al programa a que la maquina linux esté preparada? cada maquinita puede tardar desde 1 segundo hasta 10 o mas. Como veis, antes de entrar en el bucle ya hago una espera de 1 segundo para no hacer que el bucle este tanto rato.
espero vuestras recomendaciones.
por cierto, las dichosas maquinitas no disponen ni de tecado ni de pantalla
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Sab 29 Nov, 2008 6:00 pm Asunto: |
|
|
Hola, no tengo info de ese compo a mano pero mirate los eventos a ver si
puedes programar en base a rspuestas de eventos en vez del bucle, recuerdo haber hecho algo asi con otro compo de internet. |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 29 Nov, 2008 8:55 pm Asunto: |
|
|
pues me has pillado. No tengo idea de como se programan eventos. Miraré por el foro a ver si me entero de algo
Gracias por tu respuesta
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Lun 01 Dic, 2008 3:04 pm Asunto: |
|
|
Bueno, en otro hilo _Leo me contestó diciéndome que usara samba. Os explico el tema.
Los aparatitos son accesibles a ciertas partes del HD desde samba, pero la parte donde guarda los archivos de configuración esta oculta y es sólo accesible desde telnet.
Para poder entrar en la parte oculta, he escogido telnet ya que no veo (o conozco) otro componente mejor. Una vez conectado, le activo el samba para poder copiar los archivos al PC, aunque previamente, via telnet, los he copiado a la parte visible por samba.
El problema no es cómo está hecho el programa, porque funciona bien, bueno, la parte de copiar hacia el PC. Pero si lo que quiero es hacer la inversa, PC-->aparato , ahí es donde tengo el atolladero. El programa va mandando respuestas a las peticiones de telnet, (user, pass,...). El telnet de Indy envía un mensaje cada vez que recibe datos. Para esperar a que el aparato este preparado para mandarle comandos, hago la funcion del primer post donde llamo al ProccesMessages. Después de unas 7 u 8 llamadas salta el error y se cuelga el sistema de mensajes de windows. Hasta ese punto todo va correcto.
Sin embargo, y usando las mismas rutinas y funciones, en la copia (hacia el PC) todo va correcto.
Otra cosa a tener en cuenta es que solo falla en modo release. En modo debuger desde el IDE funciona bien.
Como hay muchos aparatos de estos, no puedo estar todo el día conectando el samba a cada uno, ya que si se actualiza el programa interno (firmaware) tengo que volver a activarlo de nuevo. De todas formas, los archivos que necesito están en la parte invisible para samba, con lo cual necesito telnet, quiera o no, para acceder
Espero haber explicado el problema con mas claridad. Y también espero que alguien me tire un cable con el ProccessMessages. Ya he probado una solución de Cesar que encontré en el foro, pero salta el error igualmente.
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Lun 01 Dic, 2008 10:51 pm Asunto: |
|
|
Hola bosoft, probaste con ftp, en cb6 esta un ejemplo de cómo utilizarlo solo bastaría con levantar el servicio de ftp en linux.
Si ya tienes encaminado por SAMBA, lo que se me ocurre en la parte PC->EQ es que, transfieras los archivos a una carpeta determinada del SAMBA y con algún identificador para validar usuario y consistencia de los archivos si fuera necesario (md5 por ej), luego que algún scrip en bash ejecutado por el CRON cada tiempo que creas correcto, este pueda validar y manipular los archivos a los lugares que correspondan en el linux.
También puedes hacer lo mismo para obtener los archivos EQ->PC, copias algún archivos identificador en el linux luego se ejecuta el scrip que busca los archivos de config, los copia a una parte visible para tu programa. Cuando tengas que cambiar algo solo será cuestión de rescribir el scrip, como ves todo este proceso es asincrónico y tus bucles o rutinas solo deberían verificar que los archivos existan o no.
El problema al que te enfrentas es que tienes un montón se soluciones, y la mejor solución es la que vos estés más familiarizado por ej, posibles soluciones: TELNET, SSH, FTP, SFTP, SAMBA, WEB, etc. Si todo el tiempo estas usando APACHE por ejemplo, esa seria una buena solución con algunos scrip en PHP estaría listo, sin embargo algunos pensaran que puede ser complicado. Si requieres de seguridad deberia ser SSH o SFTP.
Saludos tor _________________ Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mar 02 Dic, 2008 1:13 am Asunto: |
|
|
Gracias por tus ideas Tor, pero creo que estas complicando mas de lo debido.
No necesito seguridad ninguna, puesto que todos los equipos están en una misma red y solo está conectado un pc y no tiene salida al internet. De hecho si queremos cambiar alguna configuración lo hacemos via pen usb.
El problema que tengo no es de cómo hacerlo, de hecho funciona bien en una dirección y de forma simple, mas bien es porque usando las mismas rutinas y funciones (literalmente las mismas, no una copia) falla en la otra dirección. La única diferencia estriba en el montaje de la ruta de la copia.
Ya he explicado que hay zonas del disco duro a las cuales no tengo acceso desde samba, y no puedo pararme a estar montando ningún ftp ni nada por el estilo cada 2 o 3 días a unos 30 o 40 aparatos, puesto que cada 2 o 3 días les cambian el firmware, al cual no tengo acceso.
He intentado por todos los medios a mi alcance, cambiar las rutinas de espera y actualización, pero como no conozco la manera obligar a windows a realizar un ProcessMegasses de otra forma, no se por donde seguir. He reportado este error a CodeGear, y espero que sea un bug, porque si no lo es estoy perdido y no se por donde seguir.
Gracias Tor por su respuesta
Saludos, Bosoft. |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Vie 05 Dic, 2008 12:56 am Asunto: |
|
|
Bueno tuve chance de mirar las propiedades del compo TIdTelnet,
intercepta los siguentes eventos que pueden servirte:
OnDataAvailable, OnStatus, OnWork, OnWorkBegin, OnWorkEnd.
El primero debe referirse a cuando hay respuesta desde linux, los eventos
OnWork probablemente se refieren a la tarea que mandas a ejecutar desde
tu aplicacion. Esto para la parte de eliminar los sleeps.
Lo de la copia en una sola direccion puede ser debido a los permisos de
lectura/escritura en linux, si no tienes privilegios de escritura pues nada,
tendras que hacerte con el pass de root.
Por curiosidad que tipo de aparatos son? si no hay problema. |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 05 Dic, 2008 3:30 pm Asunto: |
|
|
no, no hay problema. Estas maquinitas son las encargadas de activar y desactivar otras mas grandes. El problema viene cuando cambiamos (actualizamos) el firmware que borra toda la configuración por la cual podemos acceder a los datos. Eso es lo que he hecho. Primero me conecto por telnet, y le vuelco el archivo de configuración de red. Después ya soy dueño y señor. Activo samba y descargo los archivos que necesitamos.
El error que he reportado a CodeGear, no es error de programa, es el compilador el que falla, de hecho hay varios reportes con un error parecido, y es que compilado en modo debug el programa funciona y en modo release no va.
En cuanto al programa, no gasto nada de lo que has dicho excepto OnDataAvailable. En las pruebas realizadas al principio no daban buenos resultados.
Gracias por tu interés, y si necesitas algo, ya sabes
Saludos, Bosoft |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos 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 votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|