因为需要用 C++ 实现联机对战的功能,但是不想直接用 winsock ,因此选了ZMQ 框架(不知道合不合适)。安装的过程还是挺艰辛的。但是也学到了些东西,记录一下。另外,Zmq 的作者 Pieter Hintjens 在 2016 年因为癌症的原因走了,他的聪明和幽默不会再有更多了,但他留下的,仍然在影响着世界。
ZMQ简介
ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。ZMQ是iMatix公司的产品,以LGPL开源协议发布。
下载libzmq
将根目录名改为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