在Linux中,如果应用程序使用原始非阻塞套接字进行读取,与poll一起使用,是否可以在套接字有一些数据可供读取时得到通知?
我试图深入研究ZeroMQ文档,但我找不到自己的方式。
我找到了标记 ZMQ_NOBLOCK
,但在调用 zmq_recv
时会应用。
有没有办法将套接字本身设置为Non-Blocking,这样如果没有什么可读的,poll可以立即返回?
我正在使用C ++作为我的应用程序的语言。
答案 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 }
强>
但没有这样的选择来打开/关闭这样的模式开启/关闭以继续存在。
Poller.poll()
立即返回&#34;?答:是的!
int zmq_poll ( zmq_pollitem_t *items, int nitems,
long timeout
);
所以,
除非有人调用 zmq_poll( ..., -1 )
,这会使投票无限期地停止,zmq_poll()
- 调用会在timeout
[ms]
<时返回/ strong>,所以使用timeout == 0
,zmq_poll()
- 调用立即返回,是否找到了任何项目,非常好,isn&#39是吗?