ZeroMQ:从多个客户端使用receive_raw接收时,是否保留了帧/消息顺序?

时间:2015-06-24 14:14:00

标签: c++ sockets zeromq publish-subscribe

我的方案如下:我使用高级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

0 个答案:

没有答案