Estoy usando process-send-string
para enviar datos a una conexión de socket, pero no estoy satisfecho con el efecto de esta función. Aproximadamente, llamando al (process-send-string "foo")
puede terminar enviando "bar"
y luego "foo"
, como se explica a continuación.escribiendo atómicamente en un socket
Como ha señalado mantenedores de Emacs, el código C de process-send-string
llama a una función wait_reading_process_output
(incluso antes de escribir realmente nada), que puede ejecutar temporizadores, que a su vez pueden llamar process-send-string
, y ningún pedido está forzada entre dichas llamadas anidadas.
Esto hace que sea prácticamente imposible implementar un protocolo RPC que esté destinado a ser utilizado por ganchos llamados en momentos no controlados. Entonces mi pregunta es, ¿cómo podríamos lograr una primitiva de escritura atómica, "sincronizada" para este propósito?
¿De verdad experimentaste ese efecto? Echando un vistazo al código fuente de Emacs, parece que el caso que describe podría surgir cuando los datos no se pueden escribir en el socket en un lote, pero requiere varias llamadas a 'sendto '. Después de cada una de estas llamadas, se llama a 'wait_reading_process_output 'para manejar los eventos del teclado y volver a mostrarlos. No me queda claro cómo los temporizadores utilizados en esa función podrían llamar 'process-send-string 'nuevamente. – Thomas
Sí, he visto lo siguiente: enviando m1, m2, m3, el extremo de conexión recibe m2, m3, m1. –
Tenga en cuenta que TCP está orientado a bytes, no orientado a paquetes. Si la aplicación escribe "1234", la pila TCP puede enviar esto en cualquier segmentación posible, por ejemplo, "12", "3", "4". Si desea ejecutar un protocolo por encima de TCP, debe encontrar definir una forma de encontrar los límites de sus mensajes, por ej. usando un campo de longitud. – bew