Situaciones con TSocket

Situaciones con TSocket

Postby jllinas » Mon Oct 19, 2009 12:02 pm

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,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: Situaciones con TSocket

Postby Baxajaun » Mon Oct 19, 2009 1:54 pm

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
User avatar
Baxajaun
 
Posts: 968
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: Situaciones con TSocket

Postby jllinas » Mon Oct 19, 2009 2:10 pm

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,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: Situaciones con TSocket

Postby Baxajaun » Mon Oct 19, 2009 2:24 pm

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
User avatar
Baxajaun
 
Posts: 968
Joined: Wed Oct 19, 2005 2:17 pm
Location: Gatika. Bizkaia

Re: Situaciones con TSocket

Postby Antonio Linares » Mon Oct 19, 2009 7:48 pm

Julio,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Situaciones con TSocket

Postby jllinas » Mon Oct 19, 2009 9:35 pm

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,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: Situaciones con TSocket

Postby Salvador » Wed Feb 03, 2010 7:43 pm

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.
Saludos
Salvador
Salvador
 
Posts: 144
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Situaciones con TSocket

Postby jllinas » Wed Feb 03, 2010 10:49 pm

Interesante Salvador, :?

¿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
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: Situaciones con TSocket

Postby Salvador » Thu Feb 04, 2010 12:23 pm

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,
Saludos
Salvador
Salvador
 
Posts: 144
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Situaciones con TSocket

Postby jllinas » Thu Feb 04, 2010 12:57 pm

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,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: Situaciones con TSocket

Postby Salvador » Thu Feb 04, 2010 7:24 pm

Ejemplo autocontenido donde surge el problema.
Code: Select all  Expand view  RUN
#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  RUN
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
 
Posts: 144
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Situaciones con TSocket

Postby Daniel Garcia-Gil » Thu Feb 04, 2010 8:39 pm

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).
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Situaciones con TSocket

Postby Salvador » Thu Feb 04, 2010 10:33 pm

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.
Saludos
Salvador
Salvador
 
Posts: 144
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Situaciones con TSocket

Postby Daniel Garcia-Gil » Thu Feb 04, 2010 11:15 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Situaciones con TSocket

Postby Antonio Linares » Fri Feb 05, 2010 8:13 am

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 13 guests