Zeromq:使用zmq实现的PUB/SUB程序,不交换消息

3

我已经写了一个简单的zmq PUB/SUB程序,但它不能正常工作。在server.c中,我只是将服务器绑定到特定的套接字,然后广播一条消息“Hi!”。同样,在client.c中,我接收发送的字符串并将其打印出来,但它总是跳过循环。当我运行客户端时,它没有从server.c接收任何消息。可能是什么问题呢?

//server.c
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main (void)
{
    //  Prepare our context and publisher
    void *context = zmq_ctx_new ();
    void *publisher = zmq_socket (context, ZMQ_PUB);
    zmq_bind (publisher, "tcp://127.0.0.1:3333");
    char *string = "Hi!";

    while (1) {
        //  Send message to all subscribers
        zmq_msg_t message;
        zmq_msg_init_size (&message, strlen (string));
        memcpy (zmq_msg_data (&message), string, strlen (string));
        int rc = zmq_msg_send (publisher, &message, 0);
        zmq_msg_close (&message);
    }

    zmq_close (publisher);
    zmq_term (context);
    return 0;
}




//client.c
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>

int main (int argc, char *argv [])
{
    int rc;
    void *context = zmq_ctx_new ();

    //  Socket to talk to server
    printf ("Collecting updates from server...\n");
    void *subscriber = zmq_socket (context, ZMQ_SUB);

    rc = zmq_connect (subscriber, "tcp://127.0.0.1:3333");
    assert (rc == 0);

      while(1){

    // Receive message from server
      zmq_msg_t message;
      zmq_msg_init (&message);
      if(zmq_msg_recv (subscriber, &message, 0))
      continue;
      int size = zmq_msg_size (&message);
      char *string = malloc (size + 1);
      memcpy (string, zmq_msg_data (&message), size);
      zmq_msg_close (&message);
      string [size] = 0;
      printf("Message is: %s\n",string);
      }

    zmq_close (subscriber);
    zmq_term (context);
    return 0;
}

绑定函数是否成功?你没有检查它是否真正绑定了吗?还要检查数据是否真的发送了!!! - Arpit
1个回答

6

SUB端需要“订阅”某些内容

.connect()之后,只需添加zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0)的用法,将其设置为订阅过滤器,以成为除默认值<*nothing*>以外的任何内容,该默认值会导致SUB端过滤器不传递任何内容(直到更改此设置)。

有关PUB/SUB行为的详细信息,请查看ZeroMQ文档和.setsockopt()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接