因為需要用 C++ 實現聯機對戰的功能,但是不想直接用 winsock ,因此選了ZMQ 框架(不知道合不合適)。安裝的過程還是挺艱辛的。但是也學到了些東西,記錄一下。另外,Zmq 的作者 Pieter Hintjens 在 2016 年因為癌症的原因走了,他的聰明和幽默不會再有更多了,但他留下的,仍然在影響着世界。
ZMQ簡介
ZMQ(ØMQ、ZeroMQ, 0MQ)看起來像是一套嵌入式的網絡鏈接庫,但工作起來更像是一個並發式的框架。它提供的套接字可以在多種協議中傳輸消息,如線程間、進程間、TCP、廣播等。你可以使用套接字構建多對多的連接模式,如扇出、發布-訂閱、任務分發、請求-應答等。ZMQ的快速足以勝任集群應用產品。它的異步I/O機制讓你能夠構建多核應用程序,完成異步消息處理任務。ZMQ有着多語言支持,並能在幾乎所有的操作系統上運行。ZMQ是iMatix公司的產品,以LGPL開源協議發布。
下載libzmq
將根目錄名改為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