zeromq的官网为:ZeroMQ。使用zmq可以方便的实现进程间通信。
zmq提供了多种语言开发包,如下图:
C语言的开发包又有两种方式,如下图:
本文主要示范czmq的基于订阅和发布的模式,实现数据的传输。实现方式仅供参考。
- 一、zmq的安装
- 将zeromq的安装包上传到指定目录,并执行解压操作,本文以4.2.1为例。
tar -zxvf zeromq-4.2.1.tar.gz
2. 自动生成配置
cd zeromq-4.2.1
./autogen.sh
3.根据配置生成makefile
./configure
4.编译安装
make && make check && make install && sudo ldconfig
5./usr/local/lib目录下安装zmq相关库
- 二、czmq的安装
- 将czmq的安装包上传到指定目录,并执行解压操作,本文以4.2.1为例。
tar -zxvf czmq-4.2.1.tar.gz
2.配置并生成makefile
cd czmq-4.2.1
./configure
3.编译安装
make && make check && make install && sudo ldconfig
4.在usr/local/lib下安装czmq相关库
三、使用czmq的方式实现数据传输
代码仅供参考。
消息发布方代码(publisher)
#include "czmq.h"
#include <iostream>
#include <unistd.h>
int main(int argc, char *argv [])
{
std::string strZmqHost = "tcp://*:5556";
std::string strTopic = "czmq-topic";
zctx_t *context = zctx_new();
void *publisher = zsocket_new(context, ZMQ_PUB);
zsocket_bind(publisher, strZmqHost.c_str());
sleep(1);
char szLine[1024];
while(true)
{
std::cin.getline(szLine, sizeof(szLine));
fflush(stdin);
std::string str = szLine;
if(str == "quit") {
break;
}
str = strTopic + " " + str;
int ret = zstr_send(publisher, str.c_str());
if(ret == -1) {
std::cout << "send error: " << str << ", ret=" << ret << std::endl;
break;
}
std::cout << "send succ: " << str << std::endl;
}
std::string str = strTopic + " quit";
zstr_send(publisher, str.c_str());
zsocket_destroy(context, publisher);
zctx_destroy(&context);
return 0;
}
消息接收方代码(subscriber)
#include <unistd.h>
#include <string>
#include <cstring>
#include <iostream>
#include "czmq.h"
int main()
{
std::string strZmqHost = "tcp://localhost:5556";
std::string strSubTopic = "czmq-topic";
std::string strQuitMsg = strSubTopic + " quit";
zctx_t* lpContext = zctx_new();
if(lpContext == nullptr)
{
std::cout << "zctx_new() error!" << std::endl;
return -1;
}
void* lpSubscriber = zsocket_new(lpContext, ZMQ_SUB);
if(lpSubscriber == nullptr)
{
std::cout << "zsocket_new() error!" << std::endl;
return -2;
}
int32_t iRet = zsocket_connect(lpSubscriber, strZmqHost.c_str());
if(iRet != 0) {
std::cout << "zsocket_connect() error, zmq_host=" << strZmqHost << std::endl;
return -3;
}
zsocket_set_subscribe(lpSubscriber, strSubTopic.c_str());
while(true)
{
char *lpData = zstr_recv(lpSubscriber);
if(lpData) {
if(strcmp(lpData, strQuitMsg.c_str()) == 0) {
free(lpData);
break;
}
puts(lpData);
free(lpData);
}
}
if(lpContext)
{
if(lpSubscriber){
zsocket_destroy(lpContext, lpSubscriber);
lpSubscriber = nullptr;
}
zctx_destroy(&lpContext);
lpContext = nullptr;
}
return 0;
}
编译并执行:
g++ -o test_sub test_sub.cpp -std=c++11 -lczmq
g++ -o test_pub test_pub.cpp -std=c++11 -lczmq
./test_pub
./test_sub
运行结果: