zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Fidder4 顶部提示 “The system proxy was changed,click to reenable fiddler capture”。
    redis 哨兵 sentinel master slave 连接建立过程
    虚拟点赞浏览功能的大数据量测试
    python基础练习题(题目 字母识词)
    python基础练习题(题目 回文数)
    python基础练习题(题目 递归求等差数列)
    python基础练习题(题目 递归输出)
    python基础练习题(题目 递归求阶乘)
    python基础练习题(题目 阶乘求和)
    python基础练习题(题目 斐波那契数列II)
  • 原文地址:https://www.cnblogs.com/flipped/p/6854735.html
Copyright © 2011-2022 走看看