【发布时间】:2013-01-19 04:51:11
【问题描述】:
我在 C 中使用 ZeroMQ 3.2。我遇到的问题是每当我尝试连接到某个远程端点时
void* context = zmq_ctx_new();
void* socket = zmq_socket(context, ZMQ_DEALER);
int rc = zmq_connect(socket, addr);
rc 始终为 0,表示一切正常。正如API 所述。即使没有服务器监听。
我错过了什么吗?
【问题讨论】:
我在 C 中使用 ZeroMQ 3.2。我遇到的问题是每当我尝试连接到某个远程端点时
void* context = zmq_ctx_new();
void* socket = zmq_socket(context, ZMQ_DEALER);
int rc = zmq_connect(socket, addr);
rc 始终为 0,表示一切正常。正如API 所述。即使没有服务器监听。
我错过了什么吗?
【问题讨论】:
一切都应该如此。 ZeroMq 的一个优点(当然取决于您如何看待它)是您不必在服务器启动后进行连接,这也意味着即使与服务器的连接暂时断开也可以连接。 ZeroMq 将保持连接(请求)并重试。
zmq_connect() 的 Api 文档指出:
对于大多数传输和套接字类型,连接不会立即执行,而是根据 ØMQ 的需要执行。因此,对 zmq_connect() 的成功调用并不意味着连接已经或可以实际建立。因此,对于大多数传输和套接字类型,绑定服务器套接字和连接客户端套接字的顺序无关紧要。第一个例外是使用 inproc:// 传输:您必须在调用 zmq_connect() 之前调用 zmq_bind()。第二个例外是 ZMQ_PAIR 套接字,它不会自动重新连接到端点。
如文档中所见,无响应/现有端点没有错误代码。基本上,只要您提供一个有效的端点(例如,您没有达到每个进程的套接字限制),您就应该很好。
【讨论】:
如指南所述:
只要客户端节点执行 zmq_connect() 连接就存在 并且该节点可以开始将消息写入套接字。在某个阶段 (希望在消息排队太多以至于他们开始收到之前 丢弃,或客户端阻塞),服务器恢复活力,执行 zmq_bind() 和 ØMQ 开始传递消息。
【讨论】: