参考网站
https://zeromq.org/download/ 这个网站的安装方式,总是不成功。
http://download.zeromq.org/ 安装包下载网址
https://github.com/zeromq/zeromq4-1/tags 安装包下载网址,我用的这个
https://blog.csdn.net/qq_27071221/article/details/119209941 这个有用
下载两个 安装包
wget https://github.com/jedisct1/libsodium/releases/download/1.0.8/libsodium-1.0.8.tar.gz
wget https://github.com/zeromq/zeromq4-1/releases/download/v4.1.8/zeromq-4.1.8.tar.gz
上面不能下载用下面的试一下(1积分)
zeromq安装包。。。。。。。-C++文档类资源-CSDN下载
操作系统 ubuntu18.04
1.安装libsodium-1.0.8.tar.gz
tar xvzf libsodium-1.0.8.tar.gz
./autogen.sh
./configure
make && make check
make install
这个主要解决 Package requirements libsodium were not met 缺失libsodium库的问题
2.安装zeromq-4.1.8.tar.gz
tar xvzf zeromq-4.1.8.tar.gz
./configure
make && make install
3.测试代码
ZmqRequestReply.h
#include<unistd.h> #include<string.h> #include<assert.h> #include<string.h> #include<zmq.h> #define TCP_CLIENT "tcp://*:5555" //客户端连接 #define TCP_SERVER "tcp://localhost:5555" //服务端绑定 这里是localhost //下面两个方法默认是阻塞的 static int s_send(void *socket, char *string);//ZeroMQ字符串发送 字符串尾部多一个0 static char *s_recv(void* socket);//ZeroMQ字符串接收 字符串尾部多一个0 /** * 应答模式 */ class ZmqRequestReply{ public: int rc; void *context, *socket; ZmqRequestReply(); void initZmqServer(); void initZmqClient(); void dataServer(std::string str); void dataClient(std::string &str); void closeZmq(); }; ZmqRequestReply::ZmqRequestReply(){ int major, minor, patch; zmq_version(&major, &minor, &patch); std::cout << "ZMQ版本:" << major << "." << minor << "." << patch << std::endl; context = zmq_ctx_new (); } void ZmqRequestReply::initZmqServer(){ socket = zmq_socket(context, ZMQ_REP); rc = zmq_connect(socket, TCP_SERVER); assert(rc == 0); } void ZmqRequestReply::initZmqClient(){ socket = zmq_socket (context, ZMQ_REQ); rc = zmq_bind(socket, TCP_CLIENT); assert(rc == 0); } void ZmqRequestReply::dataServer(std::string str){ s_send(socket, (char *)str.c_str()); sleep(1); str = s_recv(socket); std::cout << "服务端接收的数据:" << str << std::endl; } void ZmqRequestReply::dataClient(std::string &str){ s_send(socket, (char*)"who are you?"); sleep(1); str = s_recv(socket); } void ZmqRequestReply::closeZmq(){ zmq_close(socket); zmq_ctx_destroy(context); } // ØMQ字符串转换为C/C++字符串(在尾部添加0) static char *s_recv(void* socket){ // 此处使用zmq_msg_init()初始化即可, zmq_msg_recv()在内部会自动对zmq_msg_t对象进行大小设定 zmq_msg_t message; zmq_msg_init(&message); int size = zmq_msg_recv(&message, socket, 0); if(size == -1) return NULL; char *string = (char*)malloc(size + 1); memcpy(string, zmq_msg_data(&message), size); zmq_msg_close(&message); string[size] = 0; return string; } // C字符串转换为ØMQ字符串(去掉尾部的'\0'),并发送 static int s_send(void *socket, char *string){ // 因为是将数据拷贝给zmq_msg_t对象, 因此需要使用zmq_msg_init_size进行初始化 zmq_msg_t msg; zmq_msg_init_size(&msg, strlen(string)); memcpy(zmq_msg_data(&msg), string, strlen(string)); // 发送数据 int rc = zmq_msg_send(&msg, socket, 0); if(rc == -1){ printf("数据发送失败 对方不再线 等待中。。。!\n"); } // 关闭zmq_msg_t对象 zmq_msg_close(&msg); return rc; }
服务端:servermq.cpp
#include<iostream> #include "ZmqRequestReply.h" int main(){ ZmqRequestReply zmqRequestReply; zmqRequestReply.initZmqServer(); int n = 0; zmqRequestReply.dataServer("ttt"); while(true){ zmqRequestReply.dataServer("Server" + std::to_string(n)); n ++; } }
客户端代码 clientmq.cpp
#include<iostream> #include "ZmqRequestReply.h" int main(){ ZmqRequestReply zmqRequestReply; zmqRequestReply.initZmqClient(); while(1){ std::string str = ""; zmqRequestReply.dataClient(str); std::cout << "客户端接收的数据:" << str << std::endl; } }
4.编译运行: 需要gcc,自己装一下就行 zmq官方说是4.x以上版本,我的是
gcc version 10.3.0 (Ubuntu 10.3.0-1ubuntu1~20.04)
gcc servermq.cpp -o servermq -lzmq -lstdc++
gcc clientmq.cpp -o clientmq -lzmp -lstdc++
5.参考
ZMQ安装和使用_Plaggable的博客-CSDN博客_zmq安装
ZeroMQ 文档【中文版】 PDF 下载
链接:百度网盘 请输入提取码 提取码:vwh6
6.cmake中导入zeromq库
出现的问题:CMakeFiles xxxxxx: undefined reference to `zmq_socket'
这就是没告诉cmakezmq的库文件在那里
解决:
参考# https://www.codercto.com/a/51365.html
zmq需要安装 libzmq3-dev,可以查看你的系统是否安装。dpkg -l | grep libzmq3-dev
在项目的CMakeLists.txt文件配置
find_package(PkgConfig) pkg_check_modules(PC_ZeroMQ QUIET zmq) find_path(ZeroMQ_INCLUDE_DIR NAMES zmq.h PATHS ${PC_ZeroMQ_INCLUDE_DIRS} ) find_library(ZeroMQ_LIBRARY NAMES zmq PATHS ${PC_ZeroMQ_LIBRARY_DIRS} ) target_include_directories(${PROJECT_NAME} PUBLIC ${ZeroMQ_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} PUBLIC ${ZeroMQ_LIBRARY})
上面配置完毕 就能cmake.. 然后 cmake了