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

标签 c ubuntu tcp localhost zeromq

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

最佳答案

SUB 端必须“订阅”某物

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

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

关于c - Zeromq:使用 zmq 的 PUB/SUB 程序,不交换消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828822/

相关文章:

Android:将 TCP 连接从 3G 转移到 WiFi

c - 如何自动将类型转换添加到 c 源代码中的 printf 样式函数?

c - 在c中设置DEBUG环境变量

bash - 解析程序的标准输出并在完成后将其杀死

linux - 当CPU空闲率很低时如何降低路由速率(TCP/UDP)

go - 如何分别从服务器上运行的两个并发进程接收数据?

在C编程中收集8个字节到char

c - 加速循环执行 unsigned long long 模运算的性能

gcc - 无法在 ubuntu 中编译 cc、gcc |没有这样的文件或目录

node.js - 从/usr/local/bin/node 卸载 Node