天天看點

這次來談談ZeroMQ—基于消息隊列的多線程網絡庫(一)搭建環境fatal error: zmq.hpp: No such file or directory compilation terminated.

ZeroMQ官方文檔網址:http://zguide.zeromq.org/page:all

這次來談談ZeroMQ—基于消息隊列的多線程網絡庫(一)搭建環境fatal error: zmq.hpp: No such file or directory compilation terminated.

ZeroMQ是一個高性能異步消息程式庫,用于分布式或高并發應用,提供了消息隊列。但是他不像面向消息隊列的中間件。ZeroMQ的運作時并不需要專門的消息代理。

這次來談談ZeroMQ—基于消息隊列的多線程網絡庫(一)搭建環境fatal error: zmq.hpp: No such file or directory compilation terminated.

ZeroMQ支援多種語言。

因為我主用C++是以這次我隻會提及C和C++。

下面開始說安裝過程:

需要安裝的軟體
apt-get install libtool
apt-get install autoconf
apt-get install pkg-config
下載下傳 :
wget https://github.com/zeromq/libzmq/releases/download/v4.3.2/zeromq-4.3.2.tar.gz
解壓:
tar xzfv zeromq-4.3.2.tar.gz
跳轉到目錄:
cd zeromq-4.3.2
./autogen.sh
./configure
make
make install
           

可能遇到的問題:

這次來談談ZeroMQ—基于消息隊列的多線程網絡庫(一)搭建環境fatal error: zmq.hpp: No such file or directory compilation terminated.

解決方法:

apt-get install libtool

這次來談談ZeroMQ—基于消息隊列的多線程網絡庫(一)搭建環境fatal error: zmq.hpp: No such file or directory compilation terminated.

解決方法:

apt-get install autoconf

如果出現err:missing some pkg-config macros (pkg-config package)              解決方法:apt-get install pkg-config
           

此時編寫軟體時要注意頭檔案。 

如果你是要編寫.c檔案,那麼你需要加上zmq.h。

如果你是要編寫.cpp檔案,那麼你要加上zmq.hpp。

zmq.hpp的連結:https://share.weiyun.com/5oHKziQ

先給上C的代碼例子:

//  Hello World server

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main (void)
{
    //  Socket to talk to clients
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (responder, "tcp://*:5555");
    assert (rc == 0);

    while (1) {
        char buffer [10];
        zmq_recv (responder, buffer, 10, 0);
        printf ("Received Hello\n");
        sleep (1);          //  Do some 'work'
        zmq_send (responder, "World", 5, 0);
    }
    return 0;
}
           

編譯指令:gcc server.c -lzmq

這是C++的代碼例子:

//
//  Hello World server in C++
//  Binds REP socket to tcp://*:5555
//  Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <string>
#include <iostream>
#ifndef _WIN32
#include <unistd.h>
#else
#include <windows.h>

#define sleep(n)    Sleep(n)
#endif

int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        //  Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;

        //  Do some 'work'
        sleep(1);

        //  Send reply back to client
        zmq::message_t reply (5);
        memcpy (reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}
           

編譯指令為:g++ server.cpp -lzmq

如果出現:

fatal error: zmq.hpp: No such file or directory compilation terminated.

一般 Linux 系統把 /lib 和 /usr/lib 兩個目錄作為預設的庫搜尋路徑,是以使用這兩個目錄中的庫時不需要進行設定搜尋路徑即可直接使用。

解決方法:将zmq.hpp複制到 /lib 或/usr/lib中。

ZeroMQ主要有三種模式:

  • Request-Reply(請求響應)

    請求回應模型。由請求端發起請求,并等待回應端回應請求。從請求端來看,一定是一對對收發配對的;反之,在回應端一定是發收對。請求端和回應端都可以是 1:N 的模型。通常把 1 認為是 server ,N 認為是 Client 。ZeroMQ 可以很好的支援路由功能(實作路由功能的元件叫作 Device),把 1:N 擴充為 N:M (隻需要加入若幹路由節點)。從這個模型看,更底層的端點位址是對上層隐藏的。每個請求都隐含有回應位址,而應用則不關心它。

  • Publish-Subscribe(釋出訂閱)

    這個模型裡,釋出端是單向隻發送資料的,且不關心是否把全部的資訊都發送給訂閱端。如果釋出端開始釋出資訊的時候,訂閱端尚未連接配接上來,這些資訊直接丢棄。不過一旦訂閱端連接配接上來,中間會保證沒有資訊丢失。同樣,訂閱端則隻負責接收,而不能回報。如果釋出端和訂閱端需要互動(比如要确認訂閱者是否已經連接配接上),則使用額外的 socket 采用請求回應模型滿足這個需求。

  • Parallel Pipeline(管道)

    管道是單向的,從 PUSH 端單向的向 PULL 端單向的推送資料流。

    這章主要講述如何安裝編譯和ZeroMQ的模型。下一章開始用代碼來講解相應的模型。