It looks better except for the use of "size" in the loop control. The return 
code from zmq_poll is the *number of sockets* that have pending events. The way 
you are using it appears as though you believe the return code indicates the 
*number of messages* which is incorrect. The way the loop is written now, it 
will loop once and exit at most.


On Feb 19, 2013, at 10:29 AM, Lee Sylvester <[email protected]> wrote:

> Okay, thank you.  So I now have the following:
> 
> int read_zmq_connections() {
>       zmq_pollitem_t items [] = {
>               { zmq_responder, 0, ZMQ_POLLIN, 0 }
>       };
>       errno = 0;
>       int ret = 0, size = zmq_poll(items, 1, 0);
>       zmq_msg_t message;
>       while ( size > 0 && errno == 0 ) {
>               char *str = s_recv(zmq_responder);
>               parse_new_data(str);
>               free(str);
>               ++ret;
>               --size;
>       }
>       return ret;
> }
> 
> I'm going to test it a little later once I've written my client code.  :-)
> 
> Thanks again.
> 
> Cheers,
> Lee
> 
> 
> 
> On 19 Feb 2013, at 16:21, Charles Remes <[email protected]> wrote:
> 
>> Yes, you are missing out on being able to differentiate between reads & 
>> writes since you aren't checking the revents. However, in your case you only 
>> have a single socket and you only register for POLLIN, so you can just use 
>> the return code and skip the hard stuff. Any time it returns 1 then you know 
>> that your socket is readable.
>> 
>> 
>> On Feb 19, 2013, at 10:18 AM, Lee Sylvester <[email protected]> wrote:
>> 
>>> Okay, thanks.  I'm looking at the reference and I can see that zmq_poll 
>>> returns the number of items, but it feels like I'm missing something when I 
>>> rely on that :-S
>>> 
>>> Lee
>>> 
>>> 
>>> On 19 Feb 2013, at 15:52, Charles Remes <[email protected]> wrote:
>>> 
>>>> Hmmm, I'm not sure that's exactly right.
>>>> 
>>>> The basic idea is that you want to check the return code from zmq_poll. If 
>>>> it is greater than 0, then the socket can be read from. You should then 
>>>> read from the socket until no more messages are available. I don't know 
>>>> how it works with the #s_recv() function (presumably that is part of the 
>>>> czmq binding) but you want to read until the socket is empty or you get 
>>>> EAGAIN. Perhaps that function does that for you under the covers. 
>>>> 
>>>> So, the loop should be around reading from the socket and *not* around 
>>>> zmq_poll. Does that make sense?
>>>> 
>>>> 
>>>> 
>>>> On Feb 19, 2013, at 9:16 AM, Lee Sylvester <[email protected]> wrote:
>>>> 
>>>>> Thank you, that's great.  So, based on what I've read, does this look 
>>>>> correct for what I'm trying to accomplish?
>>>>> 
>>>>> int read_zmq_connections() {
>>>>>   zmq_pollitem_t items [] = {
>>>>>           { zmq_responder, 0, ZMQ_POLLIN, 0 }
>>>>>   };
>>>>>   while (1) {
>>>>>           zmq_msg_t message;
>>>>>           zmq_poll(items, 1, 0);
>>>>>           if (items[0].revents & ZMQ_POLLIN) {
>>>>>                   char *str = s_recv(zmq_responder);
>>>>>                   parse_new_data(str);
>>>>>                   free(str);
>>>>>           } else {
>>>>>                   break;
>>>>>           }
>>>>>   }
>>>>>   return 0;
>>>>> }
>>>>> 
>>>>> Thanks,
>>>>> Lee
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On 19 Feb 2013, at 14:52, Charles Remes <[email protected]> wrote:
>>>>> 
>>>>>> Take a look at the man page for zmq_poll. You can do a non-blocking poll 
>>>>>> for incoming messages on your socket. If it returns immediately with 0, 
>>>>>> then no sockets in your pollset have pending messages to read.
>>>>>> 
>>>>>> Be aware that when zmq_poll does indicate that you have messages, you 
>>>>>> must read *all* of them from the socket before zmq_poll will work again. 
>>>>>> I'm pretty sure the man page explains this.
>>>>>> 
>>>>>> Good luck.
>>>>>> 
>>>>>> On Feb 19, 2013, at 8:44 AM, Lee Sylvester <[email protected]> 
>>>>>> wrote:
>>>>>> 
>>>>>>> Hey guys,
>>>>>>> 
>>>>>>> So, I've integrated ØMQ into my server.  Now, I want to use ØMQ as a 
>>>>>>> means to supply information to a HTTP server from a separate management 
>>>>>>> app.  So, in theory, it will look something like this
>>>>>>> 
>>>>>>> int read_zmq_connections() {
>>>>>>> int ret = 0;
>>>>>>> while (zmq_has_messages(zmq_responder)) {
>>>>>>>  char *str = s_recv(zmq_responder);
>>>>>>>  parse_new_data(str);
>>>>>>>  free(str);
>>>>>>>  ++ret;
>>>>>>> }
>>>>>>> return ret;
>>>>>>> }
>>>>>>> 
>>>>>>> This way, if there are no messages on zmq_responder, then the function 
>>>>>>> will simply return.  What I don't know how to do (and can't quite find) 
>>>>>>> is how to check if messages exist on the connection.  Can anyone please 
>>>>>>> point me in the right direction?
>>>>>>> 
>>>>>>> The reason why I need this non-blocking is that I will only be calling 
>>>>>>> 'read_zmq_connections' approximately once every five minutes and I 
>>>>>>> don't want my app to hang while waiting for messages.
>>>>>>> 
>>>>>>> Thanks loads in advance,
>>>>>>> Lee
>>>>>>> _______________________________________________
>>>>>>> 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
>>>> 
>>>> _______________________________________________
>>>> 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
> 
> _______________________________________________
> 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