首先感谢知乎Ligang Wen大佬,原帖:
https://zhuanlan.zhihu.com/p/398730348
简介
这套环境由qt + libsodium + zmq + cppzmq + zmqpp组成。
zmq是ZeroMQ的主体框架,cppzmq是ZMQ的c++操作库,zmqpp是cppzmq封装后的人性化版本的库。
libsodium是加密用的库,注意这里有个坑,libsodium的版本不能太高,否则cppzmq装不上。按照下面的方案即可解决这个问题。
安装libsodium
git clone https://gitee.com/cybermadman/libsodium
cd libsodium
git checkout 1.0.10 //这里回退了几个版本,因为版本过高编译zmq时会出现-Werror=deprecated-declarations 错误,具体见zmq编译
./autogen.sh -f -s
./configure && make check
sudo make install
sudo ldconfig
cd ../
安装zmq框架
apt-get install libzmq3-dev
安装cppzmq
git clone git://github.com/zeromq/libzmq.git
cd libzmq
./autogen.sh
./configure -with-libsodium && make
sudo make install
sudo ldconfig
cd ../
安装zmqpp
git clone https://github.com/zeromq/zmqpp.git
mkdir build
cd build
cmake ..
make
sudo make install
QT配置
在编译之前,需要在QT工程文件加上下面这行,才可以正确链接到zmqpp库,cmake同理。
LIBS += /usr/local/lib/libzmqpp-static.a -lzmq
测试
跑个简单的sub-pub模式
sub端:
#include <iostream>
#include <string>
#include <zmqpp/zmqpp.hpp>
using namespace std;
int main (int argc, char *argv [])
{
zmqpp::context context_;
const string addr_port = "tcp://localhost:5555";
zmqpp::socket_type type = zmqpp::socket_type::subscribe;
zmqpp::socket socket_ = zmqpp::socket(context_,type);
socket_.set(zmqpp::socket_option::subscribe, "");
socket_.connect(addr_port);
while(1) {
zmqpp::message message;
socket_.receive(message);
std::cout <<"recv data: "<< message.get(0)<< std::endl;
}
return 0;
}
pub端:
#include <iostream>
#include <string>
#include <zmqpp/zmqpp.hpp>
#include <unistd.h>
using namespace std;
int main ()
{
zmqpp::context context_;
const string addr_port = "tcp://*:5555";
zmqpp::socket_type type = zmqpp::socket_type::publish;
zmqpp::socket socket_ = zmqpp::socket(context_,type);
socket_.bind(addr_port);
int i=0 ;
while(i<100) {
zmqpp::message message;
message << "test[" + to_string(i++)+"]";
socket_.send(message);
sleep(1);
}
return 0;
}
搞定!