Thanks Pieter for your very informative answer. Have a nice WE,
Laurent Le 18/01/2014 08:18, Pieter Hintjens a écrit :
TCP is a stream transport, not a message transport. There's no way to know how much data you will receive in any recv() call except to use your own framing (which is why ZMTP has a framing mechanism). If A sends 2,000 bytes to B, then B may receive them in anything from one to 2,000 pieces depending on network conditions. Inproc doesn't use send()/recv() at all. UDP is message based, so each recv() matches one send(). IPC is stream based, like TCP. On Fri, Jan 17, 2014 at 11:16 PM, Laurent Alebarde <[email protected]> wrote:Thanks Pieter, I assume that when the message comes here: int zmq::stream_engine_t::write (const void *data_, size_t size_) which executes: ssize_t nbytes = send (s, data_, size_, 0); the peer receives the same with the same number of recv commands ? Corollary is that there is no data aggregation of two or more send in a buffer before it goes on the wire, and on the other side recv gets the same size of data than its send counterpart. Is it still true with all transports, in particular inproc ? Sorry for the naivety of the question. Bonne nuit, Laurent Le 17/01/2014 15:30, Pieter Hintjens a écrit : You can't add to a message without breaking ZMTP. What you could conceivably do is inject command frames, and filter these out. On Fri, Jan 17, 2014 at 2:57 PM, Laurent Alebarde <[email protected]> wrote: For trimming an incoming message, the very beginning of in_event looks like the right place. For prepending an outgoing message, I would guess out_event just at the beginning of the if (!outsize) block. But I am not sure. What is the granularity of what is written with out_event / int nbytes = write (outpos, outsize); , frame ? message ? several message possible ? part of a frame possible ? Le 17/01/2014 11:40, Laurent Alebarde a écrit : Hi Devs, I am doing some experiments (cf at the end for the goal) and wonder where I could hook the beginning of a message both reading and writing. What I want to do is prepend an outgoing message and trim an incoming message (for any mechanism looks simpler) when some option is set. Typically, when the option is set, when a new message is received, I want to be able to store a certain amount of the first bytes in a new mechanism buffer, and skip them. These bytes are experimental and not ZMTP, so I have to skip or trim them to not hurt ZMTP. When a message is sent, I want to initialise the buffer with a copy of what I previously stored before ZMTP write the buffer. If it is outpos, I will do outpos += store_size; So, the question is where & when I should do that to not hurt ZMTP. FYI, The aim of this experiment is to manage to achieve CURVE proxying. My investigations and tests so far lead me to prepend the client ID in every message sent to the CURVE worker, and that the worker send back this information. Cheers, Laurent _______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev _______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev _______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev _______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
