因为需要用 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

Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ的更多相关文章

  1. 从头开始学eShopOnContainers——Visual Studio 2017环境配置

    一.安装和配置Docker环境 1.安装Docker CE for Windows 从官方网站下载并安装,https://docs.docker.com/docker-for-windows/inst ...

  2. MariaDB + Visual Studio 2017 环境下的 ODBC 入门开发

    参考: Easysoft公司提供的ODBC教程 微软提供的ODBC文档 环境: Windows 10 x64 1803 MariaDB TX 10.2.14 x64 MariaDB ODBC Conn ...

  3. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试

    由于最近需要使用OpenCV,本人需要在自己的PC上使用OpenCV,因此最近一直在研究如何使用Visual Studio编译OpenCV源代码并搭建开发环境,折腾了很长时间,查阅了很多相关资料,终于 ...

  4. Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo

    目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...

  5. visual studio 2017 installer 安装包的安装必备组件设置

    visual studio installer 2017  安装包的安装必备组件设置,默认设置只有net frmwork 4.6.1,如下图 这个时候如果打包安装,那么打出来的包一定需要先安装4.6. ...

  6. visual studio 2017 报错 无法下载安装文件。请检查Internet连接,然后重试

    vs下载完离线安装包在无网络环境下点击安装时出现无法下载安装文件.请检查Internet连接,然后重试 原因是证书没有导 解决方法 打开刚刚存放离线文件的路径,比如D:\vs2017offline,然 ...

  7. (转)在SQL Server 2016,Visual Studio 2017环境下,连接数据库屡屡失败,在connectionString上出的问题

    适用情景: 1,ServerVersion出了问题,“SqlCnt.ServerVersion”引发了类型“System.InvalidOperationException”的异常 2,在String ...

  8. win10 visual studio 2017环境中安装CUDA8

    从https://developer.nvidia.com/cuda-toolkit-archive下载CUDA 8 安装 从https://developer.nvidia.com/gamework ...

  9. Visual Studio 2017十五项新功能体验

    Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP 2017技术峰会将于这个周末(3.17)在北京举办,由 ...

随机推荐

  1. 移动web、webApp、混合APP、原生APP、androd H5混合开发 当无网络下,android怎么加载H5界面

    PhoneGap是一个采用HTML,CSS和JavaScript的技术,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够在网页中调用IOS,Android,Palm,Symbian,WP7,W ...

  2. SDN 实验室学生们

    SDN实验室系列:https://edu.cnblogs.com/campus/fzu/SdnLab --研究生及本科生们的博客及GitHub链接.欢迎各位大佬招募. 研究生 2018级 姓名 博客地 ...

  3. PS调出冷绿色电影画面风格

    原图 一.按照惯例先磨皮,我修照片的习惯是,先拉一层色阶,使直方图平均分配,画面会显得没那么灰,当然,这只是个人喜好,先加后加都没所谓. 二.由于脸部的亮度不够,显得有点脏.所以这一步主要是通过拉曲线 ...

  4. 百度地图开发者API学习笔记一(转载)

    一,实现功能: 在地图上标记点,划线等操作.如下图. 2.代码: <!DOCTYPE html> <html> <head> <meta http-equiv ...

  5. mysql备份(导出)数据库,并恢复数据

    导出某个数据库数据到文件中 假设要导出test这个数据库,那么可以在Linux命令行(不是在mysql中) [root@ubuntu /data]# mysqldump -uroot -p test ...

  6. apache benchmark 的简单安装与测试

    1. 下载apache benchmark Copy From https://blog.csdn.net/fyqaccpt96/article/details/43272001 yum instal ...

  7. UTC时间、GMT时间、本地时间、Unix时间戳

    引用: https://blog.csdn.net/u012102306/article/details/51538574 https://blog.csdn.net/foxir/article/de ...

  8. Latex常用软件

    Linux texMaker sudo apt-get install texlive-full sudo apt-get install texmaker

  9. oracle计算时间常用函数

    --ddd:一年中的第几天 select to_char(sysdate,'ddd') from dual --d:一周中的第几天 星期天是第一天 所以要-1select to_char(sysdat ...

  10. 虚拟机的ip地址为什么会发生变化

    因为虚拟机在NAT模式下由Vmware8虚拟网卡提供虚拟机的IP分配,网桥模式下由Vmware1来提供IP分配.它们都相当于 一个小型的DHCP服务器,除非改动虚拟机的网络连接方式,或动了虚拟网卡服务 ...