【问题标题】:Message passing with czmq使用 czmq 传递消息
【发布时间】:2014-10-18 07:57:25
【问题描述】:

我正在尝试使用 czmq,第一个测试在 inproc 协议上没有问题,如果“puller”和“pusher”在同一个程序中。 但是我想在不同的进程上使用它,我也尝试过ipc和tcp,但我无法实现服务器和客户端的通信。

服务器:

#include <czmq.h>
int main (void)
{

    zctx_t *ctx = zctx_new ();


    void *reader = zsocket_new (ctx, ZMQ_PULL);

    int rc = zsocket_connect (reader, "tcp://localhost:5555");
    printf("wait for a message...\n");

    char *message = zstr_recv (reader);

    printf("Message: %s",message);

    zctx_destroy (&ctx);
    return 0;
}

和客户:

#include <czmq.h>
int main (void)
{

    zctx_t *ctx = zctx_new ();

    void *writer = zsocket_new (ctx, ZMQ_PUSH);

    int rc = zsocket_bind (writer, "tcp://*:5555");
    assert (rc == service);
    zstr_send (writer, "HELLO");

    zsocket_destroy (ctx, writer);

    return 0;

}

你能告诉我我的代码有什么问题吗?我也尝试过找到其他示例代码,但没有更多成功。

更新

服务器正在等待zstr_recv 中的消息,但是客户端发送的消息不会触发服务器进程。

【问题讨论】:

  • 这是否意味着,没有一个示例代码可以在您的本地主机上正确运行,如 ZeroMQ API 文档和其他示例所示?注意:您的原型设计工作最好使用 tcp: 传输类,并且在主要功能运行后,将传输类相关行为调整为您选择的另一个。
  • 没有人能正确运行,除了 inproc 例子:czmq.zeromq.org
  • 听起来很有希望,ZeroMQ 本身没有问题。 inproc: 传输类是内存映射的。您的有效用户权限和系统设置是否允许您的代码访问文件系统(ipc:节点)和网络服务/端口号(tcp:、pgm:、epgm:)?
  • 我没有网络限制。我尝试以 root 身份运行客户端和服务器,结果是一样的:服务器没有收到来自客户端的消息。
  • 所以,尝试做两件事——让 ZMQ_PUSH 端发送更多带有 Ordinal#UUID + TimeStamp 的消息 + 重新设计 ZMQ_PULL 端以非阻塞模式读取,因为它是在 MVC/GUI 事件循环中常见并处理在调度程序重新访问 ZMQ_PULL 读取之间没有消息到达的情况。

标签: c zeromq


【解决方案1】:

发送消息后,客户端进程破坏套接字的速度太快了。使用 inproc,您可以“摆脱它”,因为 inproc 速度很快,而 TCP 在消息到达 TCP 堆栈之前必须经过更多的障碍。

如果 ZMQ_LINGER = -1(原始 ZMQ 的默认值),zsocket_destroy() 确实应该阻塞直到消息发送,但 CZMQ 的默认 linger 为 0。这意味着当套接字时丢弃传输中的消息被销毁了。

尝试将 linger(使用 zctx_set_linger)设置为大于零的值;可能是 10 毫秒,但请使用对您有利的任何值。

【讨论】:

  • 你是对的!在''zstr_send''之后我有一个''sleep(10)''并且消息被正确传输。谢谢。
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多