【发布时间】: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 读取之间没有消息到达的情况。