关于ZeroMQ和非阻塞套接字的轮询

时间:2018-04-10 15:43:37

标签: c++ sockets zeromq polling

在Linux中,如果应用程序使用原始非阻塞套接字进行读取,与poll一起使用,是否可以在套接字有一些数据可供读取时得到通知?

我试图深入研究ZeroMQ文档,但我找不到自己的方式。

我找到了标记 ZMQ_NOBLOCK ,但在调用 zmq_recv 时会应用。

有没有办法将套接字本身设置为Non-Blocking,这样如果没有什么可读的,poll可以立即返回?

我正在使用C ++作为我的应用程序的语言。

1 个答案:

答案 0 :(得分:1)

嗯,这里几乎没有遗漏点:

首先,ZeroMQ - Socket - 实例不像O / S套接字。对于主要消歧,请随时阅读有关概念差异的帖子。

这是一个经常被重新表达的错误观念,所以让我以粗体重复。

注意: ZeroMQ Socket() - 实例一个tcp-socket-as-you-know-it。最好阅读[ZeroMQ hierarchy in less than a five seconds]或other posts and discussions here

中的主要概念差异

ZMQ_NOBLOCK符号可以在更多地方使用:

zmq_recv()就是这样,zmq_send()是另一个。

这个符号在头文件中主要是 #define -ed,但某处还有一些其他值相同的别名, zmq.DONTWAIT 正在一个这样的 flag - 组合相关的符号用于python-wrappers / bindings。

Socket -instance没有(not-)阻止这样的属性:

这是您迄今为止发布的问题的核心主要内容。

Socket - 实例本身不会保留任何此类功能。

相应的(个人)实例操作 - 对 { .recv() | .send() } 方法的调用可以使用基于参数的机制来更改其每次调用的操作方式:<登记/> 的 flags = { 0, ZMQ_DONTWAIT, ZMQ_SENDMORE, ZMQ_DONTWAIT && ZMQ_SENDMORE } 但没有这样的选择来打开/关闭这样的模式开启/关闭以继续存在。

问:&#34; 有没有办法将套接字本身设置为非阻塞&#34;?答:否。

问:&#34; 有没有办法设置Poller.poll()立即返回&#34;?答:是的!

  

int zmq_poll ( zmq_pollitem_t *items, int nitems, long timeout );

所以,
除非有人调用 zmq_poll( ..., -1 ) ,这会使投票无限期地停止,zmq_poll() - 调用会在timeout [ms] <时返回/ strong>,所以使用timeout == 0zmq_poll() - 调用立即返回,是否找到了任何项目,非常好,isn&#39是吗?