我的方案如下:我使用高级C ++绑定0MQ zmqpp
。
我有一个发布商套接字( XPUB
),多个订阅者连接到该套接字( XSUB
)。
订阅消息在我的应用程序中启动一系列事件(这就是我使用XPUB
的原因)。我想传递一些额外的信息作为订阅消息的一部分,虽然我不希望它成为订阅主题的一部分,所以我把这些额外的信息放在消息的第二帧(它可以&#39 ;出于竞争条件的原因,请作为单独的消息发送)。遗憾地(或不是......)XPUB
套接字看到订阅字节( 0x01
)的那一刻,理所当然地认为此消息只能有一个帧并且分裂它(至少我认为这是这种行为的原因)。所以第二帧是另一个消息。
我通过阅读这两个消息并恢复原始的2帧消息,只需逐个读取它们,或者使用{{1}的 receive_raw()
函数}}。我唯一担心的是,由于某种原因,原始消息的两个帧应与来自其他客户端的消息交织,同时工作。我在socket
套接字上使用带有zmqpp::reactor
的poll-in轮询器来接收消息并将它们转发到内部组件,单线程。
所以,我的问题是:我的恐惧有一定基础还是毫无根据?
这是导致行为的代码:
XPUB
输出结果为:
#include <zmqpp/zmqpp.hpp>
#include <iostream>
int main(int argc, char **argv)
{
using namespace zmqpp;
using namespace std;
char frame1[] = {1, 's', 'u', 'b', 's', '\0'};
char frame2[] = {'d','a','t','a', '\0'};
context_t context;
socket_t xpubSocket(context, socket_type::xpub);
xpubSocket.bind("inproc://pub");
socket_t xsubSocket(context, socket_type::xsub);
xsubSocket.connect("inproc://pub");
xsubSocket.send_raw(frame1, strlen(frame1), socket_t::send_more);
xsubSocket.send_raw(frame2, strlen(frame2));
//I changed the first byte to be non-subscription
char frame1_1[] = {3, 's', 'u', 'b', 's', '\0'};
xsubSocket.send_raw(frame1_1, strlen(frame1), socket_t::send_more);
xsubSocket.send_raw(frame2, strlen(frame2));
bool doContinue = true;
while(doContinue)
{
message_t incoming;
doContinue = xpubSocket.receive(incoming, true);
if(!doContinue)
{
break;
}
cout << endl <<"New Message: " << endl;
for(size_t i = 0 ; i < incoming.parts() ; ++i)
{
cout << "Frame: " << i << "\t" << incoming.get(i) << endl;
}
}
}
因此,看起来每当XPUB套接字看到订阅字节时,它就会假定消息只有一个帧。
我在ubuntu上运行这个,这是包版本:
New Message:
Frame: 0 subs
New Message:
Frame: 0 data
New Message:
Frame: 0 subs
Frame: 1 data