Resending after subscribing...

I have a very simple scenario: Main process creates the socket and binds
(inproc://#1). Test thread creates another socket (code added after Martin
pointed it out) and connects (inproc://#1). Test thread then sends to the
main process. I am seeing "Resource temporarily unavailable" in the main
process, and "Operation cannot be accomplished in current state" in the
test thread.

What am I doing wrong? Please help. I am in a bit of an emergency and would
appreciate quick response.

Thanks,
Ashok


achippa@ubuntu:~/projects/groupchat$ ./client 10.1.1.1 1111
client started with ipaddress 10.1.1.1 port 1111
zmq_recv on user returned "Resource temporarily unavailable"
connected to user socket
C foo
C foo
zmq_send returned "Operation cannot be accomplished in current state"
C foo
zmq_send returned "Operation cannot be accomplished in current state"
C foo
zmq_send returned "Operation cannot be accomplished in current state"



On Sat, Dec 24, 2011 at 4:20 PM, Ashok Chippa <[email protected]> wrote:

> Hi,
>
> I am getting a "Resource temporarily unavailable" with a REP/XREP/DEALER
> socket on zmq_recv(). I have tried all three with and without ZMQ_NOBLOCK
> option and still see the same issue. This is with a simple inproc socket
> for testing.
>
> Basically, I have a process which creates a test thread. The main process
> opens the socket, and does a zmq_recv() in a while loop. The test thread
> sends messages into this socket. The zmq_send() on the test thread seems to
> be working (did not see any error there.) Even though I have a while loop I
> see the error (Resource temporarily unavailable) only once! Seems like even
> with ZMQ_NOBLOCK it is blocking and probably not receiving anything.
>
> What am I missing? (Not sure how to specify end point for inproc socket
> though.)
>
> Here's the code snippets:
>
> CREATION OF SOCKET
> ------------------------------------
>
>     /* Create socket to talk to local user/test harness.
>      */
>     user = zmq_socket(context, ZMQ_DEALER);
>     if (!user) {
>         printf("user socket create failed: %s\n", zmq_strerror(errno));
>         assert(0);
>         return 0;
>     }
>     if (zmq_bind(user, "inproc://group_chat_client") == -1) {
>         printf("user socket bind failed: %s\n", zmq_strerror(errno));
>         assert(0);
>         return 0;
>     }
>
> WHILE LOOP
> --------------------
>
>     while (1) {
>         /* Check the user socket. If there is something
>          * from the user handle it. We are basically
>          * doing round-robin between user, requestor and
>          * subscriber sockets. (Wonder zmq can be enhanced
>          * to do WRR for us between multiple sockets., Better
>          * to block on multiple sockets and unblock when a
>          * message arrives of any one of them.)
>          */
>         zmq_msg_init(&msg);
>         zmqret = zmq_recv(user, &msg, ZMQ_NOBLOCK);
>
>         if (zmqret == -1) {
>             printf("zmq_recv on user returned \"%s\"\n",
>                     zmq_strerror(errno));
>         }
>
>         if (errno != EAGAIN && errno != EWOULDBLOCK) {
>
>             printf("we have something in the user socket");
>
>             /* We have a server/user message. Parse it. We do not
>              * want zmq APIs deep within our code.
>              */
>             gc_client_get_message(&msg, &size, &request);
>
>             /* Handle the request/reply.
>              */
>             if (size) gc_client_handle_message(request, size);
>         }
>         /* Close the message.
>          */
>         zmq_msg_close(&msg);
> ...
> }
>
> CONNECT FROM TEST THREAD
> --------------------------------------------------
>
> void *
> test_main (void *arg)
> {
>     zmq_msg_t   msg;
>     size_t      size;
>     int         zmqret;
>     uint8_t    *request;
>     char       *newline;
>     char        text[256];
>
>     /* Connect to the client user socket.
>      */
>     if (zmq_connect(user, "inproc://group_chat_client") == -1) {
>         printf("connect to user socket failed: %s\n", zmq_strerror(errno));
>         pthread_exit(0);
>     }
> ...
>
> SEND CODE FROM TEST THREAD
> -----------------------------------------------------
> I verified the size (13 bytes)
>
>     /* Send it to the parent process.
>      */
>     zmq_msg_init_data(&zmsg, buf, size, NULL, NULL);
>     if (zmq_send(user, &zmsg, 0) == -1) {
>         printf("zmq_send returned \"%s\"\n", zmq_strerror(errno));
>     }
>     zmq_msg_close(&zmsg);
>
>
>
>
>
>
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to