5

我在 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中提到的一切都正常。即使根本没有服务器监听

我错过了什么吗?

4

2 回答 2

4

一切都是应有的。ZeroMq 的一个优点(当然取决于您如何看待它)是您不必在服务器启动后进行连接,这也意味着即使与服务器的连接暂时断开也可以连接。ZeroMq 将保持连接(请求)并重试。

zmq_connect()的 Api 文档指出:

对于大多数传输和套接字类型,连接不会立即执行,而是根据 ØMQ 的需要执行。因此,对 zmq_connect() 的成功调用并不意味着连接已经或可以实际建立。因此,对于大多数传输和套接字类型,绑定服务器套接字和连接客户端套接字的顺序无关紧要。第一个例外是使用 inproc:// 传输:您必须在调用 zmq_connect() 之前调用 zmq_bind()。第二个例外是 ZMQ_PAIR 套接字,它不会自动重新连接到端点。

如文档中所见,无响应/现有端点没有错误代码。基本上,只要您提供一个有效的端点(例如,您没有达到每个进程的套接字限制),您就应该很好。

于 2013-02-04T17:08:11.857 回答
1

正如指南所述:

一旦客户端节点执行 zmq_connect() 连接就存在并且该节点可以开始将消息写入套接字。在某个阶段(希望在消息排队太多以至于它们开始被丢弃或客户端阻塞之前),服务器启动,执行 zmq_bind() 并且 ØMQ 开始传递消息。

于 2013-02-04T13:27:06.227 回答