天天看点

这次来谈谈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的模型。下一章开始用代码来讲解相应的模型。