ZMQ的下载及使用
- 0.简介
- 1.下载
-
- 1.1 C语言:libzmq
- 1.2 C++:cppzmq
- 2.编译
-
- 2.1 安装Cmake
- 2.2 编译
- 3.使用
-
- 3.1 文件说明
- 3.2 工程中使用
- 3.3 代码示例
- 3.4 C++使用
0.简介
网上简介一大堆,个人而言也没怎么看,工作要用,就需要学习。
ZMQ、ZeroMQ:能够快速建立SOCKET,有多种模式可供使用,最开始接触的时候使用的是PUB-SUB模式。
1.下载
工程链接:The ZeroMQ project
1.1 C语言:libzmq
下载源码
直接从当前页面即可下载,如果想下载其他的版本,可以查看各个Release版本,分别下载资源。下载解压后的文件,如下图所示:
备注:
- doc:文档
- include:头文件
- src:源文件
- 其他:不知道
1.2 C++:cppzmq
备注:相关的操作与C++的一致
2.编译
2.1 安装Cmake
编译需要使用CMake,如果没有安装,需要手动安装一下。
CMake下载:Cmake Download
备注:安装相关注意事项,直接百度即可。
安装结果,如下图所示:[命令行不会使用,需要使用gui界面的程序]
2.2 编译
1、打开cmake-gui.exe,选择工程路径以及构建路径
- 工程路径:含有MakeFileList.txt文件的上级文件夹
- 构建路径:输出目录
2、Configure
点击之后,选择相应的构建环境:
选择完成之后,直接finish即可,自动执行configure的过程。
3、Generate
执行generate之后,将会构建工程,工程构建完毕,open project可用:
4、编译工程
open project,打开VS2019,工程较多,需要稍等片刻:
ALL_BUILD工程,右键生成即可。
备注:如果需要Win32版本,直接工程中间修改即可
感觉其中有很多都是测试工程,实际常最后使用的只有一个动态库,以及一个hpp文件
3.使用
3.1 文件说明
使用ZMQ的时候,只需要使用其中的部分文件:
ZMQ源工程目录下:
备注:需要将platform.hpp文件拷贝到src下面,具体路径如下:
copy "\ZMQ\build_4.3.4\platform.hpp" to "\ZMQ\zeromq-4.3.4\src"
ZMQ构建目录下:
具体使用的文件如下:
- bin- Debug- libzmq-v142-mt-gd-4_3_4.dll
- lib- Debug- libzmq-v142-mt-gd-4_3_4.lib- libzmq-v142-mt-sgd-4_3_4.lib
3.2 工程中使用
备注:这个lib是两个lib中比较小的那个。
3.3 代码示例
Server
// ZMQ_Test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <stdio.h>
#include "zmq.h"
#include <string>
//#include "zmq.hpp"
using namespace std;int main()
{
//servervoid* context = zmq_init(1);// 与客户端通信的套接字void* responder = zmq_socket(context, ZMQ_REP);zmq_bind(responder, "tcp://*:5555");while (1) {
// 等待客户端请求zmq_msg_t request;zmq_msg_init(&request);zmq_msg_recv(&request, responder, 0);printf("%s\n", (char*)zmq_msg_data(&request));zmq_msg_close(&request);// 返回应答int rCount = 0;while (rCount < 3) {
++rCount;printf("我:");std::string outStr;getline(cin, outStr);std::string replyStr = "客服:" + outStr;int strSize = replyStr.size();zmq_msg_t reply;zmq_msg_init_size(&reply, strSize + 1);memcpy(zmq_msg_data(&reply), replyStr.c_str(), strSize + 1);if (rCount == 3) {
zmq_msg_send(&reply, responder, 0);}else {
zmq_msg_send(&reply, responder, ZMQ_SNDMORE);}zmq_msg_close(&reply);}}// 程序不会运行到这里,以下只是演示我们应该如何结束zmq_close(responder);zmq_term(context);return 0;
}
Client
// ZMQ_Test2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include "zmq.h"
#include <string>
using namespace std;int main()
{
std::string userName="DefaultName";void* context = zmq_init(1);// 连接至服务端的套接字printf("请输入地址[格式:tcp://255.255.255.255:5555]: ");std::string address;cin >> address;cin.get();printf("正在连接至hello world服务端...%s\n",address.c_str());void* requester = zmq_socket(context, ZMQ_REQ);int res=zmq_connect(requester, address.c_str());printf("请输入昵称:");getline(cin, userName);if (userName.empty()) {
userName = "DN";}int request_nbr;for (request_nbr = 0; request_nbr != 10; request_nbr++) {
//sendstd::string inStr;printf("我:");getline(cin, inStr);std::string sendStr = userName + ":" + inStr;int strSize = sendStr.size();zmq_msg_t request;zmq_msg_init_size(&request, strSize+1);memcpy(zmq_msg_data(&request),sendStr.c_str(), strSize+1);int res=zmq_msg_send(&request, requester, 0);//printf("res=%d\n", res);zmq_msg_close(&request);for (int i = 0; i < 3; i++) {
zmq_msg_t reply;zmq_msg_init(&reply);zmq_msg_recv(&reply, requester, 0);printf("%s\n", (char*)zmq_msg_data(&reply));zmq_msg_close(&reply);}}zmq_close(requester);zmq_term(context);return 0;
}
3.4 C++使用
- C++完全兼容C的语法,可以直接使用libzmq的相关库,直接使用C的语法;
- 如果需要使用C++语法,则可直接去cppzmq的仓库,下载最新的zmq.hpp文件,添加到工程中即可;
Note that for using cppzmq, you don’t have to build it at all, it is a header only library. You need a libzmq library (static or shared) for your platform, and link it into your application/library, as described with libzmq itself. Then, you only need to #include “zmq.hpp” (and maybe #include “zmq_addon.hpp”) to use cppzmq.
If you want to develop cppzmq itself and run its tests, please provide details on your environment, in particular the OS, how/where you installed libzmq, and how you ran cmake.