zmq以及c/cpp for zmq


zmq的庫的資料太過豐富。爲了不誤人子弟,還是將諸位引導到最權威的zmq作者的項目主頁吧。自行github,不送。


我只說明一點,zmq的作者後面用c語言重寫了zmq,新的庫叫nanomsg。

相比zmq(2.0),nanomsg有不少優勢,其一,sub/pub過濾是在pub方處理,zmq是sub方過濾(減少流量)。其二,nanomsg用的epoll。

如果業務非常確定只涉及C/C++以及python,則可以放心採用nanomsg,否則,不用考慮,選ZMQ是不二隻選。

ZMQ 的官方sample有一些bug,特別是兼容C++ 11的時候,官方的一些寫法是編譯不過的。

例如ZMQ的代理相關的例子,MQ的代理。

//
//  Simple message queuing broker in C++
//  Same as request-reply broker but using QUEUE device
//
// Olivier Chamoux <[email protected]>


#include "zhelpers.hpp"

int main (int argc, char *argv[])
{
    zmq::context_t context(1);

    //  Socket facing clients
    zmq::socket_t frontend (context, ZMQ_ROUTER);
    frontend.bind("tcp://*:5559");

    //  Socket facing services
    zmq::socket_t backend (context, ZMQ_DEALER);
    backend.bind("tcp://*:5560");

    //  Start the proxy
    zmq::proxy(frontend, backend, nullptr);    //error
    return 0;
}


上述代碼在C++ 98標準中可以編譯通過(代碼作者聲明的說法),C++ 11中則會報錯。

轉去看看看報錯的行的

 inline void proxy (void *frontend, void *backend, void *capture)
    {
        int rc = zmq_proxy (frontend, backend, capture);
        if (rc != 0)
            throw error_t ();
    }
我們看看zmq_proxy的定義

ZMQ_EXPORT int zmq_proxy (void *frontend, void *backend, void *capture);

接受的是指針類型,傳入類的對象實際上是不妥的,嚴格一點的編譯檢查,縱使是C++ 98標準按道理也是不能編譯通過的。

另外需要注意的是,別看到接收的是指針就試圖通過取地址做參數,強制轉換編譯通不過。

 int rc = zmq_proxy (&frontend, &backend, capture);  //error

https://github.com/nanomsg/nanomsg

nanomsg的幾種常見模式如下官方文檔,十分推薦,這是分佈式消息的精華。很想轉載這篇博客。。還是忍住了。

http://tim.dysinger.net/posts/2013-09-16-getting-started-with-nanomsg.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章