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
