Situaciones con TSocket
- jllinas
- Posts: 189
- Joined: Fri Oct 14, 2005 12:33 am
- Location: Santo Domingo, Dominican Republic
- Contact:
Situaciones con TSocket
Hola a todos,
He desarrollado un sistema para recepción de datos satelitales que provienen de un receptor que se conecta al PC a través de puertos seriales. Funciona de maravillas.
El pasado año, también le agregue la opción de recibir datos que sean transmitidos por modem celulares GPRS, a través de sockets. También de maravillas.
El problema de esta temporada es que los clientes (que son distintos ambos, y ambos "agregan" datos a sus BD), quieren REPLICAR sus datos de uno a otro. Me explico: que uno de ellos envie datos al otro, una vez los reciba, y viceversa. Comence por intentar con MySQL, pero el problema es que en los clientes de MySQL no se puede agregar datos: unicamente el servidor de datos puede agregar a los esclavos. Ya eso se sale de mi contexto, así que me dispuse a desarrollar una rutina para replicacion de datos.
El ejercicio fue interesante, y a la vez emocionante. Lo desarrollé utilizando la clase TSocket, y lo arranque, lo cual me permitió poder lograr lo que querían mis clientes. El problema o situación surge después de unas horas, cuando realmente se detiene, y no sigue funcionando. He agregado creación de logs, pero no me dicen mucho.
Vi el hilo
viewtopic.php?f=3&t=16821&hilit=tsocket
pero ignoro si es un error de FWH o nó. Necesito que Antonio me diga al respecto...
Otra alternativa que tengo es la de realizar esta "replicacion" mediante archivos que se envien de un lado a otro, y que se proceden en ambos puntos (tal y como lo hace MySQL), pero me parece muy tedioso.
Se aceptan sugerencias, y hasta compartir soluciones !
Abrazos,
He desarrollado un sistema para recepción de datos satelitales que provienen de un receptor que se conecta al PC a través de puertos seriales. Funciona de maravillas.
El pasado año, también le agregue la opción de recibir datos que sean transmitidos por modem celulares GPRS, a través de sockets. También de maravillas.
El problema de esta temporada es que los clientes (que son distintos ambos, y ambos "agregan" datos a sus BD), quieren REPLICAR sus datos de uno a otro. Me explico: que uno de ellos envie datos al otro, una vez los reciba, y viceversa. Comence por intentar con MySQL, pero el problema es que en los clientes de MySQL no se puede agregar datos: unicamente el servidor de datos puede agregar a los esclavos. Ya eso se sale de mi contexto, así que me dispuse a desarrollar una rutina para replicacion de datos.
El ejercicio fue interesante, y a la vez emocionante. Lo desarrollé utilizando la clase TSocket, y lo arranque, lo cual me permitió poder lograr lo que querían mis clientes. El problema o situación surge después de unas horas, cuando realmente se detiene, y no sigue funcionando. He agregado creación de logs, pero no me dicen mucho.
Vi el hilo
viewtopic.php?f=3&t=16821&hilit=tsocket
pero ignoro si es un error de FWH o nó. Necesito que Antonio me diga al respecto...
Otra alternativa que tengo es la de realizar esta "replicacion" mediante archivos que se envien de un lado a otro, y que se proceden en ambos puntos (tal y como lo hace MySQL), pero me parece muy tedioso.
Se aceptan sugerencias, y hasta compartir soluciones !
Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Re: Situaciones con TSocket
Hola Julio,
no será más fácil que lo hagas a nivel de MySQL, lo puedes hacer unidireccional y te olvidas de programar.
Saludos,
Félix
no será más fácil que lo hagas a nivel de MySQL, lo puedes hacer unidireccional y te olvidas de programar.
Saludos,
Félix
- jllinas
- Posts: 189
- Joined: Fri Oct 14, 2005 12:33 am
- Location: Santo Domingo, Dominican Republic
- Contact:
Re: Situaciones con TSocket
Gracias Felix,
La verdad que lo evalué como la real posibilidad, y como mencioné, y fue probado durante un tiempo (dos meses) hasta que nos dimos cuenta que cada centro de recepción de datos es individual (son instituciones gubernamentales diferentes), y lo que ellos llaman "simplemente quieren compartir sus datos en tiempo real", resulta que uno de los servidores debe ser declarado como host de recepción, y el otro como esclavo, lo que parece no ser del agrado de cada parte.
Como mencioné, la programación utilizada fue la correcta, pues funciona bien pero se cae a las dos horas de empezar a trabajar.
Para este proyecto, lo que me propones no es una solución técnica, sino mas bien institucional, y por eso es la consulta...
Abrazos,
La verdad que lo evalué como la real posibilidad, y como mencioné, y fue probado durante un tiempo (dos meses) hasta que nos dimos cuenta que cada centro de recepción de datos es individual (son instituciones gubernamentales diferentes), y lo que ellos llaman "simplemente quieren compartir sus datos en tiempo real", resulta que uno de los servidores debe ser declarado como host de recepción, y el otro como esclavo, lo que parece no ser del agrado de cada parte.
Como mencioné, la programación utilizada fue la correcta, pues funciona bien pero se cae a las dos horas de empezar a trabajar.
Para este proyecto, lo que me propones no es una solución técnica, sino mas bien institucional, y por eso es la consulta...
Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Re: Situaciones con TSocket
Hola Julio,
si lo que quieren es compartir información, de igual a igual, he visto por ahí, replicacion master-master con MySQL
http://www.howtoforge.com/mysql-5-maste ... n-fedora-8
La solución es técnica, el problema es institucional
Saludos,
Félix
si lo que quieren es compartir información, de igual a igual, he visto por ahí, replicacion master-master con MySQL
http://www.howtoforge.com/mysql-5-maste ... n-fedora-8
La solución es técnica, el problema es institucional

Saludos,
Félix
- Antonio Linares
- Site Admin
- Posts: 42662
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 69 times
- Been thanked: 96 times
- Contact:
Re: Situaciones con TSocket
Julio,
Si pudieses publicar los logs aqui, podriamos estudiar de donde viene el problema
Si pudieses publicar los logs aqui, podriamos estudiar de donde viene el problema

- jllinas
- Posts: 189
- Joined: Fri Oct 14, 2005 12:33 am
- Location: Santo Domingo, Dominican Republic
- Contact:
Re: Situaciones con TSocket
Ok Antonio,
Gracias por responder. Dame unos dos dias, pues no me encuentro en mi país, para ponerlo de nuevo a funcionar, y recupero los logs y te los envío con mucho gusto....
Abrazos,
Gracias por responder. Dame unos dos dias, pues no me encuentro en mi país, para ponerlo de nuevo a funcionar, y recupero los logs y te los envío con mucho gusto....
Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Re: Situaciones con TSocket
Tengo un problema similar con los sockets.
Estoy desarrollando una aplicación que está constantemente recibiendo por GPRS mediante sockets la posición de varios dispositivos localizadores gps instalados en una flota de vehículos. Todo funciona correctamente durante varias horas, tras lo cual el sistema se vuelve inestable y acaba por colgarse.
Como es una aplicación que no interactúa con el usuario, hay un contador que se encarga cada determinado tiempo de llamar hb_gcall() para liberar la memoria. Tambien hay llamadas a SysRefresh() en todos los bucles. Pero este no parece ser el problema.
Utilizo la versión 10.01 de FWH con xHarbour.
Antonio, puede ser un problema de la clase Tsocket?
Gracias.
Estoy desarrollando una aplicación que está constantemente recibiendo por GPRS mediante sockets la posición de varios dispositivos localizadores gps instalados en una flota de vehículos. Todo funciona correctamente durante varias horas, tras lo cual el sistema se vuelve inestable y acaba por colgarse.
Como es una aplicación que no interactúa con el usuario, hay un contador que se encarga cada determinado tiempo de llamar hb_gcall() para liberar la memoria. Tambien hay llamadas a SysRefresh() en todos los bucles. Pero este no parece ser el problema.
Utilizo la versión 10.01 de FWH con xHarbour.
Antonio, puede ser un problema de la clase Tsocket?
Gracias.
Saludos
Salvador
Salvador
- jllinas
- Posts: 189
- Joined: Fri Oct 14, 2005 12:33 am
- Location: Santo Domingo, Dominican Republic
- Contact:
Re: Situaciones con TSocket
Interesante Salvador,
¿Qué modem celular estas utilizando?
¿La aplicación "llama" a los modem, o viceversa?
Abrazos,

¿Qué modem celular estas utilizando?
¿La aplicación "llama" a los modem, o viceversa?
Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Re: Situaciones con TSocket
Son dispositivos especiales para seguimiento de flotas (automóviles, camiones etc..) que incorporan un módem GPRS y un gps.
Los dispositivos comunican con el servidor cada x minutos. El servidor recibe su posición y devuelve un comando de reconocimiento, entonces el dispositivo elimina de la memoria la posición/es que tuviese registradas.
Por el momento estoy realizando pruebas con solo tres dispositivos. Mas adelante incorporaremos hasta un total de 120. Funciona a la perfección durante unas 48horas tras lo cual el PC donde esta instalado empieza ha denegar conexiones, impide que se puedan ejecutar otras aplicaciones y acaba por colgarse. No parece ser un problema de memoria ya que el Administrador de tareas muestra un consumo de memorias y de utilización de CPU normales.
¿Solucionaste el problema que comentas ?.
Abrazos,
Los dispositivos comunican con el servidor cada x minutos. El servidor recibe su posición y devuelve un comando de reconocimiento, entonces el dispositivo elimina de la memoria la posición/es que tuviese registradas.
Por el momento estoy realizando pruebas con solo tres dispositivos. Mas adelante incorporaremos hasta un total de 120. Funciona a la perfección durante unas 48horas tras lo cual el PC donde esta instalado empieza ha denegar conexiones, impide que se puedan ejecutar otras aplicaciones y acaba por colgarse. No parece ser un problema de memoria ya que el Administrador de tareas muestra un consumo de memorias y de utilización de CPU normales.
¿Solucionaste el problema que comentas ?.
Abrazos,
Saludos
Salvador
Salvador
- jllinas
- Posts: 189
- Joined: Fri Oct 14, 2005 12:33 am
- Location: Santo Domingo, Dominican Republic
- Contact:
Re: Situaciones con TSocket
No, aún persiste el mismo problema. Había quedado de enviar el .log del tsocket, pero la verdad que lo ví tan bien, que no los he enviado.
He estado probando con otras opciones, fuera de FWH, pero aún tampoco las concluyo.
El seguimiento de este hilo es siempre importante para mi. Veamos si Antonio u otro compañero del foro tiene algún comentario a este respecto.
Abrazos,
He estado probando con otras opciones, fuera de FWH, pero aún tampoco las concluyo.
El seguimiento de este hilo es siempre importante para mi. Veamos si Antonio u otro compañero del foro tiene algún comentario a este respecto.
Abrazos,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
Re: Situaciones con TSocket
Ejemplo autocontenido donde surge el problema.
Principio y fin del archivo delog:
El log parece correcto.
Después de 20 horas consecutivas se cortan las conexiones y no se puede iniciar ninguna aplicación en el PC.
Julio haber si alguien nos presta ayuda.
Code: Select all | Expand
#include "fivewin.ch"
#define CHAR_START Chr(169)
#define CHAR_END Chr(168)
static oSocket
function Main()
local oWnd
DEFINE WINDOW oWnd
ACTIVATE WINDOW oWnd MAXIMIZED;
ON INIT Server();
VALID ( oSocket:End(), .t. )
return nil
function Server()
local oClient
oSocket = TSocket():New( 8083 )
oSocket:lDebug:= .t.
oSocket:cLogFile:="server.txt"
oSocket:bAccept = { | oSocket | oClient := TSocket():Accept( oSocket:nSocket ),;
oClient:bRead := { | oSocket | OnReadSocket( oSocket ) },;
oClient:bClose := { | oSocket | OnCloseSocket( oSocket)},;
oClient:lDebug:= .t., oClient:cLogfile:="client.txt" }
oSocket:Listen()
return nil
function OnReadSocket( oSocket )
local xPacket, nCor, cAck, n
xPacket := oSocket:GetData()
if left(xPacket ,1 ) == CHAR_START .AND. Right(xPacket ,1 ) == CHAR_END // DAT5
nCor := StrCharCount( xPacket, CHAR_END ) // cuenta las coordenadas
for n = 1 to nCor // extraemos las cordenadas y las reconocemos
cAck := Right( StrToken( xPacket, n , CHAR_END ), 4 )
oSocket:SendData(CHAR_START+ "|H1234567890ABC|E"+ cAck+ CHAR_END )
next
endif
if left(xPacket ,3 ) == "$AV" // AVL100
oSocket:SendData("$OK*04")
endif
SysRefresh()
return nil
///////////////////////////////////////////////
function OnCloseSocket( oSocket )
oSocket:End()
return nil
Principio y fin del archivo delog:
Code: Select all | Expand
02/03/10 21:20:26: Accept Socket handle: 156
02/03/10 21:20:26: Write Socket handle: 276
02/03/10 21:20:26: Write Socket handle: 276
02/03/10 21:25:10: Accept Socket handle: 156
02/03/10 21:25:10: Write Socket handle: 276
02/03/10 21:25:10: Write Socket handle: 276
02/03/10 21:25:11: Read Socket handle: 276
02/03/10 21:25:21: Close Socket handle: 276
.
.
.
.
02/04/10 17:27:04: Read Socket handle: 304
02/04/10 17:29:05: Read Socket handle: 304
02/04/10 17:29:41: Accept Socket handle: 156
02/04/10 17:30:53: Close Socket handle: 304
...aquí se muere
El log parece correcto.
Después de 20 horas consecutivas se cortan las conexiones y no se puede iniciar ninguna aplicación en el PC.
Julio haber si alguien nos presta ayuda.
Saludos
Salvador
Salvador
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Situaciones con TSocket
Saludos salvador
la TSocket de fivewin es solo una clase wrapper para las funciones propias de window y poderlas utilizar de manera amigable al estilo fivewin
te puedo hacer una recomendacion, usa una variable que te detecte cuando estas procesando un paquete, para que no des entrada a un nuevo proceso mientras estes trabajando con uno, puedes ir llenado un array con los mensajes pendientes por procesar y los vas traduciendo de manera FIFO (first in first out).
la TSocket de fivewin es solo una clase wrapper para las funciones propias de window y poderlas utilizar de manera amigable al estilo fivewin
te puedo hacer una recomendacion, usa una variable que te detecte cuando estas procesando un paquete, para que no des entrada a un nuevo proceso mientras estes trabajando con uno, puedes ir llenado un array con los mensajes pendientes por procesar y los vas traduciendo de manera FIFO (first in first out).
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Re: Situaciones con TSocket
Hola Daniel,
El ejemplo de código mostrado arriba, solo recibe conexiones entrantes de 3 clientes a intervalos de 2 minutos, no parece ser un problema de demora al procesar los paquetes. El problema que comentas se podría presentar cuando conecten los 120 clientes que tenemos previsto.También parece ser que los sockets de windows tienen una cola que permite mantener las peticiones pendientes en espera hasta que pueden ser atendidas, las que exceden del limite de la cola son rechazadas. En caso de la clase Tsocket configura la cola cola para 5 conexiones.
Llevo días revisando la clase y los fuentes de las funciones que esta utiliza sin resultado.
Sería interesante conocer las experiencias de algún compañero de este foro que haya realizado algún proyecto similar.
Daniel gracias por tu interés.
El ejemplo de código mostrado arriba, solo recibe conexiones entrantes de 3 clientes a intervalos de 2 minutos, no parece ser un problema de demora al procesar los paquetes. El problema que comentas se podría presentar cuando conecten los 120 clientes que tenemos previsto.También parece ser que los sockets de windows tienen una cola que permite mantener las peticiones pendientes en espera hasta que pueden ser atendidas, las que exceden del limite de la cola son rechazadas. En caso de la clase Tsocket configura la cola cola para 5 conexiones.
Llevo días revisando la clase y los fuentes de las funciones que esta utiliza sin resultado.
Sería interesante conocer las experiencias de algún compañero de este foro que haya realizado algún proyecto similar.
Daniel gracias por tu interés.
Saludos
Salvador
Salvador
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Situaciones con TSocket
Salvador...
No te lo comento por la demora, ni por la cola de mensajes que manejen los socket, puede ser que estes procesando un paquete (ya vacia la cola de socket ) cuando llega otro e intenta procesar, es en ese punto pienso que debes intervenir
No te lo comento por la demora, ni por la cola de mensajes que manejen los socket, puede ser que estes procesando un paquete (ya vacia la cola de socket ) cuando llega otro e intenta procesar, es en ese punto pienso que debes intervenir
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
- Antonio Linares
- Site Admin
- Posts: 42662
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 69 times
- Been thanked: 96 times
- Contact:
Re: Situaciones con TSocket
Salvador, Julio,
Como comenta Daniel, el problema suele venir por atender a varios clientes a la vez. La Clase TSocket de FWH no está diseñada para atender a múltiples clientes.
El uso de sockets en un servidor es una clara oportunidad de uso de threads, asi cada thread atendería a un solo cliente siempre. Pero para hacer esto hay que usar Harbour (su multithreading es robusto) y que no se use GUI de FWH en el servidor, al menos no en esa sección.
Como comenta Daniel, el problema suele venir por atender a varios clientes a la vez. La Clase TSocket de FWH no está diseñada para atender a múltiples clientes.
El uso de sockets en un servidor es una clara oportunidad de uso de threads, asi cada thread atendería a un solo cliente siempre. Pero para hacer esto hay que usar Harbour (su multithreading es robusto) y que no se use GUI de FWH en el servidor, al menos no en esa sección.