zeromq-01-初学

参考网站

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安装

ZMQ简介_lfsf802的博客-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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值