Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ

时间:2023-03-08 18:19:51
Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ

因为需要用 C++ 实现联机对战的功能,但是不想直接用 winsock ,因此选了ZMQ 框架(不知道合不合适)。安装的过程还是挺艰辛的。但是也学到了些东西,记录一下。另外,Zmq 的作者 Pieter Hintjens 在 2016 年因为癌症的原因走了,他的聪明和幽默不会再有更多了,但他留下的,仍然在影响着世界。

ZMQ简介

ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。ZMQ是iMatix公司的产品,以LGPL开源协议发布。

ZMQ Guide

ZMQ指南

下载libzmq

Github仓库:ZeroMQ

将根目录名改为libzmq,执行libzmq\builds\msvc\build\buildall.bat

加载静态库

失败了o.o

2017.5.15 今天中午再次折腾了一下,终于成功了^^。

  • libzmq\bin\x64\Release\v141\static\libzmq.lib拷贝到工程根目录,修改名字为libzmq-static.lib,当然不修改也可以,只要和下一步的附加依赖项的相符就可以。

  • 项目->工程属性->链接器->输入->附加依赖项,加上 libzmq-static.lib; ws2_32.lib; iphlpapi.lib;,后面两个库不加上去编译就不能通过。

  • 项目->工程属性->C/C++->代码生成->运行库,修改为 多线程(MT),这里修改前默认的是MD,代表是动态链接,如果要调试版本,就选择MTd。

  • 项目->工程属性->C/C++->预处理器->预处理器定义,添加ZMQ_STATIC;

加载动态库

  • libzmq\bin\x64\Release\v141\dynamic\libzmq.lib拷贝到工程根目录

  • 项目->工程属性->链接器->输入->附加依赖项,加上 libzmq.lib

  • 项目->工程属性-> C/C++,附加库路径,加上libzmq\includes

  • 拷贝 libzmq\bin\x64\Release\v141\dynamic\libzmq.dll 到编译运行后的项目根目录\x64\Release下。

HelloWorld

服务端server.cpp

#include <zmq.hpp>
#include <string>
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#define sleep(x) Sleep(x)
#else
#include <unistd.h>
#endif int main() {
// 准备上下文和套接字
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:5555"); while (true) {
zmq::message_t request; // 等待客户端请求
socket.recv(&request);
std::cout << "收到 Hello" << std::endl; // 做一些“处理”
sleep(1); // 应答World
zmq::message_t reply(5);
memcpy((void *)reply.data(), "World", 5);
socket.send(reply);
}
return 0;
}

客户端client.cpp,放在另一个工程里

//
// Hello World client in C++
// Connects REQ socket to tcp://localhost:5555
// Sends "Hello" to server, expects "World" back
//
#include <zmq.hpp>
#include <string>
#include <iostream> int main ()
{
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REQ); std::cout << "Connecting to hello world server..." << std::endl;
socket.connect ("tcp://localhost:5555"); // Do 10 requests, waiting each time for a response
for (int request_nbr = 0; request_nbr != 10; request_nbr++) {
zmq::message_t request (6);
memcpy ((void *) request.data (), "Hello", 5);
std::cout << "Sending Hello " << request_nbr << "..." << std::endl;
socket.send (request); // Get the reply.
zmq::message_t reply;
socket.recv (&reply);
std::cout << "Received World " << request_nbr << std::endl;
}
return 0;
}

10次的消息成功通讯了,然而客户端最后异常结束了。o.o