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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM