Sto utilizzando process-send-string
per inviare dati a una connessione socket, ma non sono soddisfatto dell'effetto di questa funzione. Approssimativamente, chiamare (process-send-string "foo")
potrebbe finire con l'invio di "bar"
e quindi con "foo"
, come spiegato di seguito.scrittura atomica su una presa
Come rilevato dalla Emacs manutentori, il codice C di process-send-string
chiama una funzione wait_reading_process_output
(anche prima di scrivere nulla), che può eseguire temporizzatori, che a sua volta può chiamare process-send-string
, e nessun ordinamento viene forzata tra tali chiamate nidificate.
Ciò rende praticamente impossibile l'implementazione di un protocollo RPC che è destinato ad essere utilizzato da hook chiamati a orari incontrollati. Quindi la mia domanda è: come potremmo raggiungere una primitiva di scrittura atomica, "sincronizzata" per questo scopo?
Hai effettivamente provato quell'effetto? Dando uno sguardo al codice sorgente di Emacs, sembra che il caso che descrivi possa sorgere quando i dati non possono essere scritti sul socket in un batch, ma richiede più chiamate a "sendto". Dopo ciascuna di queste chiamate, viene chiamato 'wait_reading_process_output 'per gestire gli eventi della tastiera e il nuovo invio. Non mi è chiaro come i timer usati all'interno di quella funzione possano chiamare di nuovo 'process-send-string '. – Thomas
Sì, ho visto quanto segue: inviando m1, m2, m3, la connessione riceve m2, m3, m1. –
Si noti che TCP è orientato ai byte, non orientato ai pacchetti. Se l'applicazione scrive "1234", lo stack TCP può inviarlo in qualsiasi segmentazione possibile, ad esempio "12", "3", "4". Se si desidera eseguire un protocollo sopra TCP, è necessario trovare definire un modo per trovare i limiti dei messaggi, ad es. utilizzando un campo di lunghezza. – bew