C/C++编程:ZeroMQ安装以及使用(windows+centos)

  • ZeroMQ(也称为ØMQ,0MQ或ZMQ)是一种高性能的异步消息传递库,旨在用于分布式或者并发应用程序中。它提供了一个消息队列,但是与面向消息的中间件不同,ZeroMQ系统可以在没有专用消息代理的情况下运行。
  • ZMQ通过各种传输(TCP、进程内、进程间、多播、WebSocket等)支持通用消息传递模式(发布/订阅、请求/回复、客户端/服务器等),从而使消息传递变得简单。
  • ZeroMQ由大型贡献者社区开发。有许多流行编程语言的第三方绑定以及C#和Java的本机端口。
  • ZeroMQ的理念从零开始。零表示零代理(ZeroMQ是无代理),零延迟,零成本(免费)和零管理。
  • 更广泛地说,“零”是指渗透到项目中的极简主义文化。我们通过消除复杂性而不是通过公开新功能来增加功能。

C

  • C开发人员可以使用两个选项CZMQ或libzmq(低级zeromq库)。

  • 对于C开发人员,推荐的绑定是CZMQ,它为ØMQ提供了一个高级API,并带有诸如轮询器,线程管理和安全性助手之类的其他类。

windows + vs2019 + cmake + czmq

安装

vcpkg  install czmq:x64-windows

编写cmake

cmake_minimum_required (VERSION 3.8)


add_executable (zmp_server "zmp_server.cpp" "zmp_server.h")



include_directories("C:/Users/oceanstar/vcpkg/win/vcpkg/installed/x64-windows/include")
link_directories("C:/Users/oceanstar/vcpkg/win/vcpkg/installed/x64-windows/lib")

find_package(czmq CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME}  PRIVATE czmq czmq-static)

例子

#include <czmq.h>
int main(void)
{
    zsock_t* push = zsock_new_push("inproc://example");
    zsock_t* pull = zsock_new_pull("inproc://example");
    zstr_send(push, "Hello, World");

    char* string = zstr_recv(pull);
    puts(string);
    zstr_free(&string);

    zsock_destroy(&pull);
    zsock_destroy(&push);
    return 0;
}

效果: 出现错误Assertion failed: Successful WSASTARTUP not yet performed (…\src\signaler.cpp:192)
在这里插入图片描述

解决:

#include <czmq.h>
int main(void)
{
    zsock_t* push = zsock_new_push("inproc://example");
    zsock_t* pull = zsock_new_pull("inproc://example");
    zstr_send(push, "Hello, World");

    char* string = zstr_recv(pull);
    puts(string);
    zstr_free(&string);

    zsys_shutdown();
    zsock_destroy(&pull);
    zsock_destroy(&push);
    return 0;
}

效果:
在这里插入图片描述

centos + clion + cmake + libzmq

安装

1、https://github.com/zeromq/libzmq/
在这里插入图片描述
在这里插入图片描述

2、下载并安装

cd /etc/yum.repos.d/
wget https://download.opensuse.org/repositories/network:messaging:zeromq:release-stable/CentOS_7/network:messaging:zeromq:release-stable.repo
yum install zeromq-devel

cmake编写

cmake_minimum_required(VERSION 3.16)
project(libcuul_study)

set(CMAKE_CXX_STANDARD 11)

include_directories(/usr/local/include)
link_directories(/usr/local/lib)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} zmq)

windows + vs2019 + cmake + libzmq

安装

vcpkg install zeromq:x64-windows

编写cmake

cmake_minimum_required (VERSION 3.8)


add_executable (zmp_server "zmp_server.cpp" "zmp_server.h")


include_directories("C:/Users/oceanstar/vcpkg/win/vcpkg/installed/x64-windows/include")
link_directories("C:/Users/oceanstar/vcpkg/win/vcpkg/installed/x64-windows/lib")



find_package(ZeroMQ CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE libzmq libzmq-static)

测试程序

1、服务端

#include <zmq.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#ifndef _WIN32
#include <unistd.h>
#else
#include <windows.h>
#endif


void MySleep(const unsigned int milliseconds)
{
#ifdef _WIN32
    ::Sleep(milliseconds);
#else
    usleep(milliseconds * 1000);
#endif
}

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");
        MySleep(1);          //  Do some 'work'
        zmq_send(responder, "World", 5, 0);
    }
    return 0;
}

2、客户端

#include <zmq.h>
#include <string.h>
#include <stdio.h>
#ifndef _WIN32
#include <unistd.h>
#else
#include <windows.h>
#endif
int main (void)
{
    printf ("Connecting to hello world server…\n");
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");

    int request_nbr;
    for (request_nbr = 0; request_nbr != 10; request_nbr++) {
        char buffer [10];
        printf ("Sending Hello %d…\n", request_nbr);
        zmq_send (requester, "Hello", 5, 0);
        zmq_recv (requester, buffer, 10, 0);
        printf ("Received World %d\n", request_nbr);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

效果:
在这里插入图片描述

windows + qt+ qmake + libzmq

安装

vcpkg install zeromq:x64-windows

编写qmake

INCLUDEPATH += C:\Users\oceanstar\vcpkg\win\vcpkg\installed\x64-windows\include
LIBS    += C:\Users\oceanstar\vcpkg\win\vcpkg\installed\x64-windows\lib\libzmq-mt-4_3_3.lib

并将C:\Users\oceanstar\vcpkg\win\vcpkg\installed\x64-windows\bin的libzmq-mt-4_3_3.dll放到二进制文件所在目录下
在这里插入图片描述

测试程序

#include <QCoreApplication>
#include <zmq.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int major, minor, patch;
    zmq_version(&major, &minor, &patch);
    printf("Current ZeroMQ version is %d.%d.%d\n", major, minor, patch);
    return a.exec();
}

在这里插入图片描述

C++

  • C开发人员可以使用四个选项:cppzmq、zmqpp、azmq、czmqpp
    • cppzmq是libzmq的C ++绑定
    • zmqpp是libzmq的高级绑定。
    • czmqpp是基于高级czmq API的绑定。
    • fbzmq是与Apache Thrift集成的绑定,此外还提供更高级别的抽象。它需要C ++ 14。

windows + vs2019 + cmake + cppzmq

安装

vcpkg install cppzmq:x64-windows

编写cmake

cmake_minimum_required (VERSION 3.8)

add_executable (zmp_server "zmp_server.cpp" "zmp_server.h")

include_directories("C:/Users/oceanstar/vcpkg/win/vcpkg/installed/x64-windows/include")
link_directories("C:/Users/oceanstar/vcpkg/win/vcpkg/installed/x64-windows/lib")

find_package(cppzmq CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE cppzmq cppzmq-static)

例子

#include <string>
#include <zmq.hpp>
int main()
{
   zmq::context_t ctx;
   zmq::socket_t sock(ctx, zmq::socket_type::push);
   sock.bind("inproc://test");
   const std::string_view m = "Hello, world";
   sock.send(zmq::buffer(m), zmq::send_flags::dontwait);
}

centos+ clion+ cmake + cppzmq

centos + clion + cmake + libzmq这个目录处下载的默认只有<zmq.h>头文件,这个文件是ZeroMQ开发的C语言版本。如果想要使用C++开发版本的<zmq.hpp>头文件,那么需要自己下载zmq.hpp文件,然后复制到我们ZeroMQ安装路径的include目录下就可以了

wget https://github.com/zeromq/cppzmq/archive/master.zip

unzip master.zip


cd cppzmq-master

sudo cp ./zmq.hpp /usr/local/include


问题:执行./ci_build.sh

CMake Error at tests/CMakeLists.txt:51 (catch_discover_tests):
  Unknown CMake command "catch_discover_tests".

解决: yum install catch-devel无法解决
在这里插入图片描述

参考:


版权声明:本文为zhizhengguan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。