c++ - 关于 ZeroMQ 和轮询非阻塞套接字 :

标签 c++ sockets zeromq distributed-computing polling

在 Linux 中,如果应用程序使用原始非阻塞套接字进行读取,并结合轮询,是否可以在套接字有一些数据可供读取时收到通知?

我试图深入研究 ZeroMQ 文档,但找不到方法。

我找到了标志 ZMQ_NOBLOCK,但它在调用 zmq_recv 时应用。

有没有一种方法可以将套接字本身设置为非阻塞,以便在没有可读取的情况下轮询可以立即返回?

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

最佳答案

嗯,这里有几个遗漏点:

首先,ZeroMQ-Socket-实例与 O/S 套接字完全不同。要消除主要歧义,请随时阅读有关概念差异的帖子。

这是一个经常被重新表述的误解,所以让我以粗体重复一遍。

注意:ZeroMQ Socket()-实例不是如您所知的tcp-socket。最好阅读 [ ZeroMQ hierarchy in less than a five seconds 中的主要概念差异。 ] 或 other posts and discussions here


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

zmq_recv() 是其中一个,zmq_send() 是另一个。

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


Socket-实例没有(不)阻塞这样的属性:

这是您目前发布的问题中的核心主要失误。

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

相应的(单独的)实例操作 - 调用 { .recv() | .send() -method 可以使用基于参数的机制来更改它的每次调用操作方式:
标志 = { 0, ZMQ_DONTWAIT, ZMQ_SENDMORE, ZMQ_DONTWAIT && ZMQ_SENDMORE } 但是没有这样的选项来“打开”-任何这样的模式开/关以持续存在。


问:“有没有办法将套接字本身设置为非阻塞”?
答:没有。


问:“有没有办法设置 Poller.poll() 立即返回
答:是的!

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

所以,
除非有人调用 zmq_poll( ..., -1 ),这会使轮询无限期地挂起,否则 zmq_poll() 调用将返回为延迟为 timeout [ms],因此使用 timeout == 0zmq_poll()-调用立即返回,无论是否找到任何项目,太好了,不是吗?

关于c++ - 关于 ZeroMQ 和轮询非阻塞套接字 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49757852/

相关文章:

c# - c++/cli 仅将内部成员公开给托管类

c++ - 如何检查一棵树是否是另一棵树的子树?

node.js - websockets - 拒绝套接字连接

java - 通过 TCP 使用 JeroMQ,有没有办法获取发件人的 IP?

javascript - 我应该如何处理node.js中ZMQ的轮询?

c++ - 如何定义两个相互依赖的类,最好是在同一个头文件中?

c++ - 链表拷贝构造函数C++

c - inet_ntop 函数段错误(可能是转换错误)

sockets - boost::asio - 对绑定(bind)到特定网络接口(interface)的说明

php - 同时运行多个 cron 作业时如何克服服务器负载问题?