我正在尝试使用czmq,使用inproc协议进行第一次测试,如果同一程序中的“puller”和“pusher”。 但我想在不同的processus上使用它,我也尝试过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
中的消息,但客户端发送的消息不会在服务器进程上触发任何内容。
答案 0 :(得分:3)
发送消息后,客户端进程正在过快地销毁套接字。使用inproc,你可以侥幸逃脱它。因为inproc很快,而TCP必须在消息到达TCP堆栈之前经历更多障碍。
确实,zsocket_destroy()应该阻塞,直到消息被发送,如果ZMQ_LINGER = -1(默认带有原始ZMQ),但是CZMQ的默认逗留为0.这意味着当套接字丢弃传输中的消息被毁了。
尝试将linger(使用zctx_set_linger)设置为大于零的值;也许10毫秒,但使用对你有益的任何价值。