【问题标题】:Zeromq: PUB/SUB program using zmq, no exchange of messagesZeromq:使用 zmq 的 PUB/SUB 程序,不交换消息
【发布时间】:2014-09-13 23:49:57
【问题描述】:

我在 zmq 中编写了一个简单的 PUB/SUB 程序,但它不起作用。在 server.c 中,我所做的只是将服务器绑定到特定的套接字,然后广播一条消息“嗨!,同样,在 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;
}

【问题讨论】:

  • 绑定函数成功了吗??你没有检查它是否真的绑定?还要检查数据是否真的发送了!!!

标签: c ubuntu tcp localhost zeromq


【解决方案1】:

SUB 方必须“订阅”某些内容

只需在.connect() 之后添加zmq_setsockopt( subscriber, ZMQ_SUBSCRIBE, "", 0 ) 的用法,将其设置为订阅过滤器,使其变为默认值*nothing*> 以外的任何内容,这会导致什么都不通过SUB 侧过滤器(直到更改此设置)。

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

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多