zmq-cpp:recv() 等待数据,尽管设置了ZMQ_DONTWAIT
zmq-cpp: recv() waits for data despite ZMQ_DONTWAIT being set
我正在尝试使用 ZMQ_DONTWAIT
标志使用 ZeroMQ 实现非阻塞接收方法,但recv()
行为就像在没有标志的情况下被调用一样:
auto start = std::chrono::steady_clock::now();
auto have_data = sock_->recv(&reply, ZMQ_DONTWAIT);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start).count();
std::cout << duration << " " << have_data;
sock_
是实例化为REQ
套接字的zmq::socket_t
。
在这种情况下,have_data
始终为真,duration
是REP
服务器回复所需的任何内容(0 到几百毫秒(。
请注意,我说的是 zmq.hpp
中定义的 ZeroMQ 的 cpp 绑定,其中recv()
的声明与 zmq.h
中的声明不同:
inline bool recv (message_t *msg_, int flags_ = 0);
在这里,recv()
返回true
是否已收到数据,false
errno
是否EAGAIN
ZMQ_DONTWAIT
立即返回recv()
是否有任何先决条件?
(我使用的是zmq
版本4.1.2(
是的。(ZeroMQ
应考虑先决条件。
一个小提示:ZeroMQ 允许人们设置具有ZMQ_RCVTIMEO == 0
或性能合理值的setsockopt()
。
然而,主要问题隐藏在REQ
/REP
行为模式中。
如果应用程序在REQ
">跳">到状态[*]
并在那里等待任何可能已经到达[REQ]-<Rx>
缓冲区的内容(在此用例中原则上是不可能的(,或者可能会在稍后的某个时间到达,但REP
交易对手没有任何要回复的,未经REQ
事先.recv()
请求,不得也不会.send()
任何内容。
]-<Tx>- - - - - - - - - + + - - - - - - - -<Tx>-[
]-<Rx>- - - - - - - -+ | : +- - - - - - -<Rx>-[
[REQ]____________________:__| :__|__________________[REP]
: | : |
APP.send() ]--->.send()--:->| : |
] | : : |
] | : ____________________:__|>
] | : : |M
. . . . .M
? ? ? ? ?
. . . . .M
] | : : |M_.recv()--->[ APP.recv()
] | : | : [ and
. . . . . [ can
? ? ? ? ? ?
. . . . . [
] | : | : [ .send()
] | : | : [ after
] | : | : [ .recv()
] | : | : [
] | : |<-:--.send()<---[ APP.send()
] | : /: |
] <|__:____________________/ : |
] M| : : |
. M. . . .
? ? ? ? ?
. M. . . .
[*] ] M| : : |
APP.recv() ]<---.recv()_M| : : |
: | : |
你可以看看名为 czmq 的高级 ZeroMQ API。它带有ZeroMQ库。它有函数 zstr_recv_nowait(( 详细信息: zstr 手册页
例:
//some code
void *listener = zsocket_new (ctx, ZMQ_SUB); //zctx_t *ctx
//...
while (!zctx_interrupted)
{
char* message = zstr_recv_nowait(listener);
if (message && message[0]!=' ') {
//do some work
}
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- zmq-cpp:recv() 等待数据,尽管设置了ZMQ_DONTWAIT
- 如何将 ZMQ 发布/订阅模式设置为仅供预授权订阅者使用