Hi Devs,

From the exchange below, I wish to develop a complementary API for libzmq. For the ones who have not followed the thread below, it would enable to encapsulate ZMPT in a lower protocol, itself embedded in another ZMTP layer (tunel backend). My goal is to be able to proxy CURVE and so its handcheck end-to-end, but probably many other use cases are possible.

Use case:

void *client = zmq_metasocket (ctx, ZMQ_DEALER, ZMQ_DEALER);

What it does:

|_______________client ____________________
_________tunel _______
Client  --inproc---|||frontend|    /   backend
DEALER ZMQ_STREAM||| DEALER| |


Normal API will adress the socket on the left. Everything else is hidden. The second ZMQ_DEALER is for the tunel backend. It could be ROUTER also, and possibly anything else.

The tunel will use a transport: "inproc://tunel00x", with x static and incremented for each new metasocket.
The internal socket will be able to be configured with: zmq_setmetasockopt
With setmetasockopt, it will be possible to plug some utility functions between the tunel frontend and backend.

Any suggestions or contributions welcome.

Cheers,

Laurent.




Le 18/01/2014 16:08, Laurent Alebarde a écrit :
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

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

Reply via email to