Once you have successfully called recv(), you MUST call send() before calling recv() again.
-- Gonzalo Diethelm DCV Chile From: [email protected] [mailto:[email protected]] On Behalf Of Yi Ding Sent: Friday, January 27, 2012 11:15 AM To: Martin Sustrik Cc: ZeroMQ development list Subject: Re: [zeromq-dev] changing the C++ api to not throw exceptions on EFSM You mean: send (s, msg); recv (s, msg) => EAGAIN poll (s); recv (s, msg) => OK recv (s, msg) => EAGAIN send (s, msg); recv (s, msg) => EAGAIN poll (s); recv (s, msg) => OK recv (s, msg) => EAGAIN Right? The issue is that the second EAGAIN is replaced by EFSM. At least here's the way I understood it, please feel free to correct me: 1) right after sending a message, call recv immediately to reset the edge triggering, otherwise select/epoll will never return. 2) after receiving a message with OK, call receive again to check if there's anything else coming down the wire / reset the edge triggering. I guess for req-rep, step number 2 may not be necessary (unless we want to handle multi-part messages, which has a different check anyways) but the general advice people have given on this list is to use a while loop when recving. I can write some example code with select/epoll if you'd like to test it yourself. Thanks, Yi
_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
