Page 1 of 2

Situaciones con TSocket

PostPosted: Mon Oct 19, 2009 12:02 pm
by jllinas
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,

Re: Situaciones con TSocket

PostPosted: Mon Oct 19, 2009 1:54 pm
by Baxajaun
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

Re: Situaciones con TSocket

PostPosted: Mon Oct 19, 2009 2:10 pm
by jllinas
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,

Re: Situaciones con TSocket

PostPosted: Mon Oct 19, 2009 2:24 pm
by Baxajaun
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

Re: Situaciones con TSocket

PostPosted: Mon Oct 19, 2009 7:48 pm
by Antonio Linares
Julio,

Si pudieses publicar los logs aqui, podriamos estudiar de donde viene el problema :-)

Re: Situaciones con TSocket

PostPosted: Mon Oct 19, 2009 9:35 pm
by jllinas
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,

Re: Situaciones con TSocket

PostPosted: Wed Feb 03, 2010 7:43 pm
by Salvador
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.

Re: Situaciones con TSocket

PostPosted: Wed Feb 03, 2010 10:49 pm
by jllinas
Interesante Salvador, :?

¿Qué modem celular estas utilizando?

¿La aplicación "llama" a los modem, o viceversa?

Abrazos,

Re: Situaciones con TSocket

PostPosted: Thu Feb 04, 2010 12:23 pm
by Salvador
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,

Re: Situaciones con TSocket

PostPosted: Thu Feb 04, 2010 12:57 pm
by jllinas
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,

Re: Situaciones con TSocket

PostPosted: Thu Feb 04, 2010 7:24 pm
by Salvador
Ejemplo autocontenido donde surge el problema.
Code: Select all  Expand view
#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 view
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.

Re: Situaciones con TSocket

PostPosted: Thu Feb 04, 2010 8:39 pm
by Daniel Garcia-Gil
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).

Re: Situaciones con TSocket

PostPosted: Thu Feb 04, 2010 10:33 pm
by Salvador
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.

Re: Situaciones con TSocket

PostPosted: Thu Feb 04, 2010 11:15 pm
by Daniel Garcia-Gil
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

Re: Situaciones con TSocket

PostPosted: Fri Feb 05, 2010 8:13 am
by Antonio Linares
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.