私はprocess-send-string
を使用してソケット接続にデータを送信していますが、この機能の効果に満足していません。おおよそ(process-send-string "foo")
と呼び出すと、"bar"
が送信され、次に"foo"
が送信されます。アトミックにソケットに書き込む
としては、Emacsのメンテナが指摘し、process-send-string
のCコードが機能wait_reading_process_output
呼び出す順番にprocess-send-string
を呼ぶ可能性がある、タイマーを実行することができ、そして何の順序は、このようなネストされた呼び出しの間で施行されていない、(でも、実際には何を書き込む前に)。
これは、制御されていない時間に呼び出されたフックによって使用されることを意図したRPCプロトコルを実装することを事実上不可能にします。ですから、私の質問は、この目的のためにどのように原子同期の "書き込み"プリミティブを達成できるのでしょうか?
実際にその影響を経験しましたか? Emacsのソースコードを一見すると、データをソケットに一度に書き込むことができず、 'sendto 'を複数回呼び出す必要があると、記述したケースが発生する可能性があります。これらの呼び出しのたびに、キーボードイベントと再表示を処理するために 'wait_reading_process_output 'が呼び出されます。その関数内で使用されたタイマーが 'process-send-string 'をもう一度呼び出すことができるかどうかはわかりません。 – Thomas
はい、私は以下を見てきました:m1、m2、m3を送信すると、接続端はm2、m3、m1を受信します。 –
TCPはパケット指向ではなく、バイト指向であることに注意してください。アプリケーションが「1234」を書き込む場合、TCPスタックは、可能なセグメンテーション、例えば「12」、「3」、「4」でこれを送ることができる。 TCPより上のプロトコルを実行する場合は、メッセージの境界を見つける方法を定義する必要があります。長さフィールドを使用します。 – bew