我正在尝试使用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_
是zmq::socket_t
实例化为REQ
套接字。
在这种情况下,have_data
始终为true,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
立即返回?
(我正在使用XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("ABC");
doc.AppendChild(root);
for (int i = 0; i < 3; i++)
{
XmlElement anotherid;
XmlElement id;
id = doc.CreateElement("DEF");
anotherid = doc.CreateElement("GEH");
anotherid.SetAttribute("Name", "");
anotherid.SetAttribute("Button", "");
root.AppendChild(id);
id.AppendChild(anotherid);
}
doc.Save(@"C:\dummyxml.xml");
版本4.1.2)
答案 0 :(得分:2)
ZeroMQ
先决条件应予以考虑。) 小调: ZeroMQ允许用户设置setsockopt()
with ZMQ_RCVTIMEO == 0
或性能合理的值。
然而,主要问题隐藏在 REQ
/ REP
行为模式中。
如果某个应用程序在 REQ
“ 跳转 ”正确进入状态 [*]
< / strong>并等待那些可能已经进入 [REQ]-<Rx>
-buffer的任何内容(在此用例中主要是不可能的)或者可能会在稍后到达时间,但有一个问题,因为 REP
交易对手没有回复任何内容,如果没有事先.send()
一个.recv()
,则必须REQ
1}}的请求。
]-<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| : : |
: | : |
答案 1 :(得分:0)
你可以看看名为czmq的高级ZeroMQ api。它配备了ZeroMQ库。 它具有函数zstr_recv_nowait()详细信息:zstr man page
示例:
//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]!='\0') {
//do some work
}
}