Recepcion de Lineas TCP


([N1] jcalvarez) #1

Hola a todos;
A ver si por favor alguien me puede dar un consejo sobre la recepción de lineas por un puerto tcp.

Proceso adjunto…
Resumo
Tengo un objeto tcp que hace de servidor con un proceso que recibe una linea detrás de otra mediante un bucle.
Las lineas son enviadas por unos sensores cardiacos a traves de un puerto TCP.

Todo funciona correctamente, pero cuando dejo de recibir lineas durante un rato, el bucle se para(hasta aquí bien), pero cuando los sensores vuelven a enviar lineas el servidor ya no recibe nada.

He cambiado el tamaño del bucle y el tiempo de espera del comando “Protocolo TCP Recibir linea” y no hay manera cuando deja de recibir lineas,si es por unos segundos recupera y continua correctamente pero si pasa mas de un min ya no sigue.

He probado con un servidor TCP externo por si el problema fuera del cliente y funciona correctamente, algo me esta faltando en velneo para mantener este bucle corriendo.

Agradecería cualquier ayuda.

SERVER.pdf (18.8 KB)


([N1] wikan) #2

El problema del protocolo de Velneo es que no es igual al de otro lenguaje.

No conectas y mantiene la conexión hasta que la cierras, recibe, procesa y cierra. Por lo que si tu sensor envia 2 líneas, Velneo estará en el bucle hasta que termine, pero mientras las conexión sigue estando ahí, es decir, no se abre otro puerto, por eso aunque tu sensor mande, no puede por que el puerto está ocupado.

  1. Si puedes modificar la parte que envía, haz que mande un carácter “extraño” y en Velneo, en vez de recibir línea, haz un recibir hasta carácter marca.

Luego parsea todo lo que te ha llegado y los procesas.

  1. Creo que en su momento se hablo de como mantener la conexión abierto, ahora mismo lo que se me ocurre es que mantegas el bucle pero le pongas la condición, LINEA !"----", es decir, mantienes la conexión abierta siempre que en LINEA te venga contenido, si no, corto y cierro

  2. Eliminar el bucle y recibir solo cada vez la línea y procesarla, sin buble ninguno, conecta->procesa->cierra. Tendrías que modificar el cliente para que actue así, ya que los otros lenguajes si mantienen la conexión abierta, tendrías que hacer lo mismo con el sensor, conecta->envía->cierra

Saludos


([N1] jcalvarez) #3

La opción 2 cuando dices corto y cierro a que te refieres, a que al no cumplir la condición se sale solo no hay que poner nada para cerrarlo ¿verdad?


([N1] wikan) #4

Efectivamente,
en el bucle pones la condición del if, así cuando la linea venga “----” asumes que ha terminado la recepción y no entras al bucle.


([N1] wikan) #5

@jcalvarez, lo solucionaste.
Me gustaría saber algo cuando lo tengas solucionado.


([N1] jcalvarez) #6

Parece que he conseguido estabilizarlo.
He hecho pruebas con el carácter “extraño” y con el fin de linea y funciona mejor el fin de linea.

Al final mi problema eran en los caracteres que mandaba desde C++ si Veneo esta esperando linea de texto y “/n” y no recibe texto se para.
Hay que tener sumo cuidado con lo que envía el cliente para que el proceso no se pare.

Un saludo y gracias por tu ayuda.