• 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,执行libzmquildsmsvcuilduildall.bat

    加载静态库

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

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

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

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

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

    加载动态库

    • libzmqinx64Releasev141dynamiclibzmq.lib拷贝到工程根目录

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

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

    • 拷贝 libzmqinx64Releasev141dynamiclibzmq.dll 到编译运行后的项目根目录x64Release下。

    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

  • 相关阅读:
    VSCode中按ESLint规则格式化Javascript代码
    VSCode设置资源管理器字体大小
    Windows下利用安装压缩包安装MySQL
    Windows部署Apache 2.4.46及PHP 8.0.3
    npm设置国内镜像
    IDEA运行Tomcat输出信息乱码
    深入理解jvm虚拟机读书笔记-Java内存区域与内存溢出异常
    Navicat Premium
    mysql安装
    ElasticSearch 基础
  • 原文地址:https://www.cnblogs.com/flipped/p/6854735.html
Copyright © 2020-2023  润新知