ZMQ套接字连接超时

ZMQ socket connection timeout

我正在为 ZMQ (cppzmq) 使用 C++ 绑定,我正在尝试使用 .setsockopt() 方法设置 TCP 套接字的连接超时,如下所示:

int connectTimeout = 1000;
socket.setsockopt(ZMQ_CONNECT_TIMEOUT, &connectTimeout, sizeof(connectTimeout));
socket.connect(clientConfiguration.uri);

但是,在代码到达套接字上的实际 .send()/.recv() 之前,我没有看到任何事情发生(抛出异常?)。为了确保套接字有机会抛出,我在 .connect().send() 方法之间放置了一个睡眠。

根据文档 .zmq_connect() 只是进入 READY 状态,而没有与端点建立实际连接。所以问题是我应该在什么时候以及如何体验连接超时?

So the question is when and how I should experience the connection timeout ?

什么时候?

嗯,实际上从来没有直接因为这只是 ZeroMQ API-exposed 设置 Context() -实例的内部Finit-State-M机器操作方法(这里是.setsockopt() 设置选定的传输-class behind-the-API-curtain ISO-OSI-L3 details ).

如何(如果有的话) ?

嗯,还有一些其他的 .setsockopt() 细节,(如果放在上面)可能会间接感受到设置 ZMQ_CONNECT_TIMEOUT 连接超时的影响。再次,只是间接地,通过修改的 FSM 行为,即在某种程度上,.Context()-引擎实例将如何响应此类事件(所有纯粹是内部的,在 API 的幕后 -这就是为什么我们在方法论上使用 API 方法来分离关注点,不是吗?)。

更多详情请参考:

  • API 有关 ZMQ_IMMEDIATE
  • 的详细信息
  • API 有关 ZMQ_RECONNECT_IVL
  • 的详细信息
  • API 关于 ZMQ_RECONNECT_IVL_MAX 的详细信息。
    ( API 版本不断发展,请注意并非所有 代理都共享相同的 ZeroMQ API 版本。所以最好记住 Zen-of-Zero 并随时重新-使用 anxient 设计者的指令 #ASSUME NOTHING. )

拖车奖金:

如果不熟悉 ZeroMQ 工具,可能会发现这 5 秒阅读 [ ] 部分中的主要概念差异很有用,

(courtesy Martin Sústrik, co-father of both ZeroMQ + nanomsg.尊重!)