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

转载于:https://www.cnblogs.com/flipped/p/6854735.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值