Problemas intermitentes con un servidor TCP

Hola a todos,

estoy montando una serie de servicios tcp directamente sobre el servidor. Desde un navegador web todo funciona perfecto. Pero cuando accedo a esos servicios desde otro programa (no velneo), tiene un comportamiento muy raro. Funciona bien una vez si y otra vez no. Cuando no funciona ni siquiera llega al servidor. Es como si tras cada conexión con éxito la conexión quedara abierta o algo así.
Si en vez acceder directamente al vServer, el mismo programa accede a través del apache, todo funciona bien, en todos los casos. Lo que me lleva a pensar que el problema esta en la respuesta del vServer.
Estoy un poco perdido.
¿Alguien tiene alguna idea de cual puede ser el problema?

Gracias y un saludo

Depende, falla cuando envías información(POST)?, o simplemente cuándo la pides (GET)

De momento solo estoy probando con el GET.

Acabo de descubrir una forma de arreglarlo, pero no sé si es correcta desde el punto de vista del protocolo TCP.

Esta es la resupuesta del apache:

HTTP/1.1 200 OK
Date: Wed, 14 Apr 2021 06:58:23 GMT
Server: Apache/2.4.25 (Win32) OpenSSL/1.0.2k
Content-Length: 4
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

8:58

Con esta respuesta, atacando el apache, no me da problema. Pero con esta misma respuesta, atacando directamente el vServer me da un error.

Si cambio a:

HTTP/1.1 200 OK
Date: Wed, 14 Apr 2021 06:58:23 GMT
Server: Apache/2.4.25 (Win32) OpenSSL/1.0.2k
Content-Length: 4
Connection: close
Content-Type: text/html; charset=utf-8

8:58

entonces ya no me da el error.

¿Es correcto el uso de close después del envió del paquete?

Un saludo

Connection: keep-alive

más o menos así:
HTTP/1.1 200 OK
Server: vServer 7.0
Content-Type:application/json; charset=utf-8
Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 4

esto sobra: Keep-Alive: timeout=5, max=100
y en content type el tipo de datos que envíes en la respuesta, en el ejemplo es un Json

@informatica el problema que tienes es este:

El objeto TCP de velneo trabaja de forma serial y no tiene capacidad de concurrencia alguna, por lo que cada llamado debe de recibir la petición, obtener la data y enviarla al cliente, con la indicación explicita de que despues de eso cierre la conexión, sino el navegador va a tratar de tener la conexión activa unos segundos porque es muy probable que en un request normal se pidan otros assets y se pueda reusar la conexión.

Tu estas usando la versión 1.1 de HTTP la cual introduce el keep alive, el cual velneo no puede soportar.

La solucion:

Este tema lo aborde en su momento en la construcción de Cirrus.js asi que puedes tomar nota de la forma en que el objeto TCP recibe la data y la forma en que envia la informacion, asi como el contenido de los headers para cerra la conexión.

http://heavyblade.github.io/cirrus/

Gracias a Bitcodesoft y a Cristian por vuestras respuestas. Me han servido de mucho.

Ya he conseguido poner el funcionamiento la parte del servidor por TCP. Tanto para una petición GET, como para una POST.
Mi problema inicial era que no leía toda la petición. Examinando el código de Cirrus, puede encontrar el problema.
Hasta ahora lo he probado con pocos accesos concurrentes, ahora me toca probarlos con múltiples accesos.