- 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版权协议,转载请附上原文出处链接和本声明。