[zeromq-dev] how to hook ZMTP to prepend outputs and trim inputs ?
Laurent Alebarde
l.alebarde at free.fr
Sat Jan 18 16:08:25 CET 2014
Le 18/01/2014 11:58, Goswin von Brederlow a écrit :
> On Fri, Jan 17, 2014 at 11:40:13AM +0100, Laurent Alebarde wrote:
>> 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
> How about this? (thread names in "")
>
> "A" REQ <-inproc-> STREAM "Tunnel A"
> "Tunnel A" DEALER <---tcp--> ROUTER "Midpoint"
> "Midpoint" DEALER <---tcp--> ROUTER "Tunnel B"
> "Tunnel B" STREAM <-inproc-> REP "B"
>
> The "Tunnel A" and "Tunnel B" use a STREAM socket to get at the
> on-wire data. Each data packet send they envelope into a ZMQ message
> and send out their other socket. As the name suggests this tunnels
> data from "A" to "B" without the "Midpoint" parsing the data. Now
> the data can be anything, e.g. a CURVE encrypted and authenticated ZMQ
> connection.
>
> Does that help?
If I catch it, my initial architecture attempt:
| ___________________server__________________
____________proxy___________
Client ------- frontend / backend ------- Worker
DEALER ZMQ_STREAM ZMQ_STREAM DEALER
CURVE CURVE|
becomes:
|_______________client A___________________ ____________________________server________________________________
proxy ________________worker B ___________
_________tunel A______ ______midpoint____ _____tunel B______
Client --inproc---|||frontend| / backend ----tcp---- frontend / backend --inproc-- frontend / backend --inproc-- Worker
DEALER ZMQ_STREAM||| DEALER| ROUTER ROUTER ROUTER ZMQ_STREAM DEALER
CURVE CURVE|
which means I envelop ZMTP into whatever protocol I want, itself
envelopped again into ZMTP, otherwise said, I put my custom protocol
between two ZMTP layers ?
As I have adapted your suggestion to my need, I should be able to
simplify to:
|_______________client A___________________ ____________________server_________________
proxy __worker B __
_________tunel A______ _____midpoint_____
Client --inproc---|||frontend| / backend ----tcp---- frontend / backend --inproc-- Worker
DEALER ZMQ_STREAM||| DEALER| ROUTER ZMQ_STREAM DEALER
CURVE CURVE|
Thanks very much Goswin ! Very smart solution. I have to diggest it a
little.
Cheers,
Laurent
>
> MfG
> Goswin
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20140118/1a6819e8/attachment.htm>
More information about the zeromq-dev
mailing list