Let's clarify:

Process      client              proxy1                  proxy2     worker
               |             |-----------| |----------|            |
socket         cl           f1          b1            f2     b2           wk
endpoint       |c----e1-----b| |c----e2-----b|          |c----e3----b|
queue (pipe) cl/e1/s ----> f1/e1/r --> b1/e2/s ---> f2/e2/r --> b2/e3/s ---> wk/e3/r
cl/e1/r <---- f1/e1/s <-- b1/e2/r <--- f2/e2/s <-- b2/e3/r <--- wk/e3/s

In the "endpoint" line, "c" is for connect, "b" for bind, address is ex, x = 1, 2, 3, transport is not specified. In the "queue (pipe)" line, "r" is for receive, "s" for send. Each socket has one queue for receiving and another one for sending. Queue names are <socket>/<endpoint>/<direction: send|recv>

Is it correct regarding on what queue identifications are based inside libzmq ?

If it is correct, then chaining proxies shall be performed as (pseudo code):

connect (c, e1) bind (f1, e1) bind (f2, e2)        bind (w, e3)
                             connect (b1, e2) connect (b2,e3)
                             proxy (f1, b1) proxy (f2, b2)

Comments / corrections please, does it work like that ?

Cheers,

Laurent





Le 21/01/2014 12:32, Goswin von Brederlow a écrit :
On Tue, Jan 21, 2014 at 11:09:54AM +0100, Laurent Alebarde wrote:
Hi Devs,

This is my thuesday morning stupid question: say I have a socket on
which I send a message, and just after I put a receive on this same
socket in the code. What prevents in libzmq to receive the message I
have just sent ?

Let's raise the question differently, what prevents zmq_proxy to
loop indefinitely since what it receives on socket A, it sends it on
socket B, and vice versa ?

socket A                                        socket B
    | ______________________\______________________ |
    |/                      /                      \|
    |                                               |
    |\______________________/______________________/|
    |                       \                       |
     zmq_proxy(A,B)does not loop on itself like this

Why does it manage to work like this:

socket A                                        socket B
    |                                               |
-->|---------------------------------------------->|------------>
    |                                               |
    |                                               |
<--|<----------------------------------------------|<------------

zmq_proxy(A,B)does what it is expected to do, yeah !
I imagine it is more like:

socket A           socket B
    |                  |
-->| recv() -> send() |------------>
    |                  |
    |                  |
<--| send() <- recv() |<------------

Each socket has an incoming and outgoing queue. Recv() looks in the
incoming queue and send() puts messages in the ougoing queue and never
the two shall meet.

Can I chain: zmq_proxy(A,B); zmq_proxy(B,C), zmq_proxy(C,D),
assuming I start them in different threads ?
I don't see why not.
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