Node.js flush socket after write

Estoy implementando un protocolo TCP en Node.

Fuente completa:
https://github.com/roelandmoors/ads.js/blob/master/ads.js

especificaciones:
http://infosys.beckhoff.com/content/1033/tcadsamsspec/html/tcadsamsspec_amstcppackage.htm?id=17754

El problema es que uso esto para enviar un paquete:

this.tcpClient.write(buf); 

Si envío varios comandos, entonces los comandos múltiples se combinan en un solo paquete TCP.
Esto no funciona.

Hay más preguntas sobre esto en SO, pero recomiendan usar un delimitador.
Pero como no puedo cambiar el protocolo, esta no es una opción.

¿No hay una solución simple para limpiar el zócalo?

socket.setNoDelay () no ayuda.

Edit: También intenté usar el evento de drenaje para enviar la siguiente escritura, ¿pero nunca se llama al evento?

Actualizar:

Esto parece resolver el problema, pero es muy feo y ahora no lo hago si siempre funciona.
En lugar de escribirlo directamente, escribo en un búfer:

 this.writeFILO.push(buf); 

Cada ciclo (?) Estoy escribiendo un paquete en el flujo de socket:

 var sendCycle = function(ads) { if (ads.writeFILO.length > 0) { ads.tcpClient.write(ads.writeFILO.shift()); } setTimeout(function() { sendCycle(ads); }, 0); } 

Me refiero a la socket.write(data, [encoding], [callback]) :

El parámetro de callback opcional se ejecutará cuando los datos se escriban finalmente, esto puede no ser inmediato.

Por lo tanto, configure una cola (la matriz está bien) que contiene los mensajes que se enviarán.
Cuando se llama a la callback anterior, verifique la cola y envíe si es necesario.

Sin embargo, esto no garantiza lo que estás buscando, tendrás que probar. Desafortunadamente, los documentos no indican explícitamente cuando hay un acuse de recibo desde el punto final remoto de que realmente recibió ese mensaje …

Al final, como usted concluyó, TCP es una secuencia .

Una idea interesante que se me ocurrió ahora, sin embargo, si está FORZADO a usar un protocolo existente, abra dos conexiones TCP.
Cuando una conexión reconoce (sea cual sea el protocolo de nivel superior) que recibe ese mensaje, envíe la siguiente a través del otro … y así sucesivamente …

De todos modos, bonito reto 🙂

Sé que esta es una pregunta antigua, y no estoy 100% seguro de entender lo que está buscando, pero hay una manera de vaciar un socket en el nodo. Primero necesitas implementar una clase Transform.

Vea aquí por ejemplo: https://nodejs.org/api/stream.html#stream_implementing_a_transform_stream .

Luego puede tomar su flujo y canalizarlo a través de su transformación antes de conectarlo a su zócalo.

No tengo este módulo de nodo, pero he visto un ejemplo de esto aquí: https://github.com/yongtang/clamav.js/blob/master/index.js#L8

Estaba equivocado. TCP es un flujo y el protocolo funciona como un flujo, pero no lo manejé como un flujo.

PD: el envío de mensajes separados parece funcionar con setImmediate ()