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

  1. #include <zmq.hpp>
  2. #include <string>
  3. #include <iostream>
  4. #ifdef _WIN32
  5. #include <windows.h>
  6. #define sleep(x) Sleep(x)
  7. #else
  8. #include <unistd.h>
  9. #endif
  10. int main() {
  11. // 准备上下文和套接字
  12. zmq::context_t context(1);
  13. zmq::socket_t socket(context, ZMQ_REP);
  14. socket.bind("tcp://*:5555");
  15. while (true) {
  16. zmq::message_t request;
  17. // 等待客户端请求
  18. socket.recv(&request);
  19. std::cout << "收到 Hello" << std::endl;
  20. // 做一些“处理”
  21. sleep(1);
  22. // 应答World
  23. zmq::message_t reply(5);
  24. memcpy((void *)reply.data(), "World", 5);
  25. socket.send(reply);
  26. }
  27. return 0;
  28. }

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

  1. //
  2. // Hello World client in C++
  3. // Connects REQ socket to tcp://localhost:5555
  4. // Sends "Hello" to server, expects "World" back
  5. //
  6. #include <zmq.hpp>
  7. #include <string>
  8. #include <iostream>
  9. int main ()
  10. {
  11. // Prepare our context and socket
  12. zmq::context_t context (1);
  13. zmq::socket_t socket (context, ZMQ_REQ);
  14. std::cout << "Connecting to hello world server..." << std::endl;
  15. socket.connect ("tcp://localhost:5555");
  16. // Do 10 requests, waiting each time for a response
  17. for (int request_nbr = 0; request_nbr != 10; request_nbr++) {
  18. zmq::message_t request (6);
  19. memcpy ((void *) request.data (), "Hello", 5);
  20. std::cout << "Sending Hello " << request_nbr << "..." << std::endl;
  21. socket.send (request);
  22. // Get the reply.
  23. zmq::message_t reply;
  24. socket.recv (&reply);
  25. std::cout << "Received World " << request_nbr << std::endl;
  26. }
  27. return 0;
  28. }

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. 软件工程(FZU2015) 赛季得分榜,第七回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  2. html总结:固定表格中单元格宽度

    当然要提前设置好table的width值,然后再写这个,使得每列宽度都相等. <style> table { table-layout: fixed; } </style>

  3. Linux 典型应用之常用命令

    软件操作相关命令 软件包管理 (yum) 安装软件 yum install xxx(软件的名字) 如 yum install vim 卸载软件 yum remove xxx(软件的名字) 如 yum ...

  4. Tomcat Cluster

    Tomcat群集配置| Tomcat集群| MuleSofthttps://www.mulesoft.com/tcat/tomcat-cluster Tomcat Clustering - A Ste ...

  5. C#的类型推断发展史

    前言:随着C#的版本升级,C#编译器的类型推断功能也在不断的升级以适应语言进化过程中的变化,并为这个过程做了相应的优化. 隐式类型的数组 在C#1和C#2中,作为变量声明和初始化的一部分,初始化数组的 ...

  6. Oracle 表分区(Partition)

    表分区功能能够改善应用程序性能,提高数据库可管理性和可用性,是数据库管理非常关键的技术.数据库通过使用分区提高查询性能,简化日常管理维护工作. 1 分区优点 1) 减少维护工作量,独立管理每个表分区比 ...

  7. Linux基础操作二

    编程语言的作用及与操作系统和硬件的关系 编程语言的作用:用来定义计算机程序的形式,程序员用它来编写程序,进而控制其向计算机发出指令,使计算机完成人类布置的任务. 编程语言的作用及与操作系统和硬件的关系 ...

  8. 运行pip报错:Fatal error in launcher: Unable to create process using '"'

    参考: https://blog.csdn.net/cjeric/article/details/73518782

  9. Kettle中表输出字段和字段选择

    表输出: 字段选择: 注:字段选择可以输出匹配后的选中列,表输出则输出匹配后的所有列.

  10. 老男孩python学习自修【第三天】列表用法

    列表的使用: list.append(value) 向列表增加元素 list.insert(index, value) 向列表指定元素插入元素 list.extend(newlist) 用新的列表扩展 ...