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
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to