[zeromq-dev] libev and ZMQ
Arnaud Loonstra
arnaud at sphaero.org
Mon Mar 8 13:22:13 CET 2021
Hi Arun,
I'm not sure what to spot. I'm using czmq mostly and hardly ever libzmq
directly. But I also just see libzmq code and not libev, or did I miss
something? What you are referring to is when you are doing
filedescriptor polling yourself without libzmq's poll methods.
Also I don't have any experience with Go. Can't advice you there.
Rg,
Arnaud
On 06-03-2021 22:49, Arun Athrey Chandrasekaran wrote:
> Arnaud,
> Following up on my previous email, please see samples of my
> client and server codes attached showing how I use the ZMQ APIs. The
> endpoints are TCP-based. The client sends a message over the REQ socket
> and expects a response from the server over the SUB socket. The server
> routine gets called on socket activity and after a ZMQ poll, it responds
> according to the received message over the PUB socket. After the server
> is done with recv/send, it does a ZMQ poll (which is expected to do
> this: "..../applications must retrieve the actual event state with a
> subsequent retrieval of the 'ZMQ_EVENTS' option."/ )
>
> Thanks,
> *Arun*
>
> On Thu, Feb 25, 2021 at 12:54 PM Arun Athrey Chandrasekaran
> <achandr8 at ncsu.edu <mailto:achandr8 at ncsu.edu>> wrote:
>
> Arnaud,
> As you correctly point out,
>
> /"The ability to read from the returned file descriptor does not
> necessarily indicate that messages are available to be read from, or
> can be written to, the underlying socket; applications must retrieve
> the actual
> event state with a subsequent retrieval of the 'ZMQ_EVENTS' option."
> /
>
> This may be causing the problem. Even after the client sends a
> message and the server responds, I get one or two more calls from
> libev. In the callback though, I do a ZMQ poll which comes back with
> no events. My client code is in golang and my server code is in C++.
> After receive and send I do a ZMQ poll in the server to take care of
> this:
>
> "applications must retrieve the actual event state with a subsequent
> retrieval of the 'ZMQ_EVENTS' option"
>
> I don't know if the client should do something after send/receive
> and FWIW, I have tried a few different APIs in golang to achieve
> the above but to no avail.
>
> Thanks,
> *Arun*
>
>
>
> On Thu, Feb 25, 2021 at 12:27 PM Arnaud Loonstra <arnaud at sphaero.org
> <mailto:arnaud at sphaero.org>> wrote:
>
> On 25-02-2021 19:35, Arun Athrey Chandrasekaran wrote:
> > Hi all,
> > Are there any gotchas w.r.t using libev with ZMQ? I
> want to
> > use ZMQ to receive and send messages from/to another process and
> > instead of a ZMQ server in an infinite loop listening for
> incoming
> > requests, I want to use libev to look for socket activity.
> What I have
> > found out so far is that even when there is no real socket
> activity, I
> > still get "ghost" callbacks from libev. I tried updating the
> ZMQ_EVENTS
> > on both client and server sides after ZMQ recv and send but
> that did not
> > help.
> >
> > Thanks,
> > *Arun*
> >
>
> Hi Arun,
>
> If you have some concept code it would really help. You can use
> zeromq
> in any event system which is able to poll on file descriptors.
> There are
> some caveats you have to be aware of. I'm not sure how this is
> done with
> the newer threadsafe sockets though.
>
> From
> https://github.com/zeromq/libzmq/blob/2bf998f7e0aa19e89918627d386d526e4f2e25dd/doc/zmq_getsockopt.txt
> <https://github.com/zeromq/libzmq/blob/2bf998f7e0aa19e89918627d386d526e4f2e25dd/doc/zmq_getsockopt.txt>"
>
> The 'ZMQ_FD' option shall retrieve the file descriptor
> associated with the
> specified 'socket'. The returned file descriptor can be used to
> integrate the
> socket into an existing event loop; the 0MQ library shall signal
> any pending
> events on the socket in an _edge-triggered_ fashion by making
> the file
> descriptor become ready for reading.
>
> NOTE: The ability to read from the returned file descriptor does not
> necessarily indicate that messages are available to be read
> from, or can be
> written to, the underlying socket; applications must retrieve
> the actual
> event
> state with a subsequent retrieval of the 'ZMQ_EVENTS' option.
>
> NOTE: The returned file descriptor is also used internally by
> the 'zmq_send'
> and 'zmq_recv' functions. As the descriptor is edge triggered,
> applications
> must update the state of 'ZMQ_EVENTS' after each invocation of
> 'zmq_send'
> or 'zmq_recv'.To be more explicit: after calling 'zmq_send' the
> socket may
> become readable (and vice versa) without triggering a read event
> on the
> file descriptor.
>
> CAUTION: The returned file descriptor is intended for use with a
> 'poll' or
> similar system call only. Applications must never attempt to
> read or
> write data
> to it directly, neither should they try to close it.
>
>
> Rg,
>
> Arnaud
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org <mailto:zeromq-dev at lists.zeromq.org>
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
> <https://lists.zeromq.org/mailman/listinfo/zeromq-dev>
>
>
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
More information about the zeromq-dev
mailing list