最近在研究Zero的使用。
我在网上找了一下,发觉大部分博客都写得乱七八糟,又不写明什么版本,什么系统下的,我都不知道怎么样才能弄出个编译过的程序来,只好自己摸索了。
我是windows下 使用vs2010的,v4.0.4的版本官方 0mq api 好像还没加上去,我是参照老版本(v3.1)的用法来的。
使用前你要对windows下动态库的使用有个基本了解。我的上一篇博客有讲,但有点乱,有时间再改一改。
这里我是用了动态库的隐式连接,需要动态库的 动态库文件".dll" , 动态库的LIB文件".lib" , 动态库的函数引入声明 "zmq.h" 和 "zmq_utils.h" 中有了(实现方式应该是我上篇博客末尾中的 "预编译开关切换类的导入导出定义");
本篇要试的是请求--回应模式:
使用步骤:
1.Zmq动态库的获取:
首先先下载 Zeromq 下来:http://zeromq.org/area:download,点击”Windows installers",下完安装。
安装完成后,在安装目录 C:\Program Files\ZeroMQ 4.0.4 下面,你能找到刚刚的4个文件:
ZeroMQ 4.0.4 \bin 中的 “libzmq-v100-mt-gd-4_0_4.dll”,
ZeroMQ 4.0.4 \lib 中的 "libzmq-v100-mt-gd-4_0_4.lib",
ZeroMQ 4.0.4 \include 中的"zmq.h" 和 "zmq_utils.h"
复制到你 新建要用的 项目工作目录当中。
这是服务端的,客户端也一样;
如果你的编译器不是vs2010,需要什么版本请参考:http://zeromq.org/distro:microsoft-windows
至于Debug版在是带调试信息的,Release版文件则小很多,两个都可以用,你个人喜欢。
2.Zmq动态库的使用:
1.创建server端,win32控制台 ,空项目,把 动态库文件复制进来。代码如下:
//2014-4-2 programed by sixbeauty //zeromp 通讯测试server 端 #include "zmq.h" #include "zmq_utils.h" //Zeromq 函数的导入在这里帮我们实现了 #include#pragma comment(lib,"libzmq-v100-mt-gd-4_0_4.lib") int main() { std::cout << "-------------------Zeromq REP style-----------------------" <<std::endl; std::cout << "---------------------Author:SanYue------------------------" <<std::endl; void* context=zmq_init(1); //指定zmq 处理I/0事件的thread pool 为1 void* z_socket=zmq_socket(context,ZMQ_REP); zmq_bind(z_socket,"tcp://*:5555"); // accept connections on a socket int recvn=1; while(1) //循环工作 { //接受部分 zmq_msg_t recv_msg; zmq_msg_init(&recv_msg); zmq_msg_recv(&recv_msg,z_socket,0); //0表示非阻塞 std::cout<<"第\t"< "\t次收到client信息:\t"; std::cout<<(char*)zmq_msg_data(&recv_msg)<<std::endl; zmq_msg_close(&recv_msg); //发送部分 zmq_msg_t send_msg; zmq_msg_init_size(&send_msg,6); memcpy(zmq_msg_data(&send_msg),"world",6); zmq_sendmsg(z_socket,&send_msg,0); zmq_msg_close(&send_msg); } zmq_close(z_socket); zmq_term(context); return 0; }
2.client端,一样是 win32控制台 空项目,把 动态库文件复制进来。代码如下:
//2014-4-2 programed by sixbeauty //zeromp 通讯测试client 端 #include "zmq.h" #include "zmq_utils.h" //Zeromq 函数的导入在这里帮我们实现了 #include#pragma comment(lib,"libzmq-v100-mt-gd-4_0_4.lib") int main() { std::cout << "-------------------Zeromq REB style-----------------------" <<std::endl; std::cout << "---------------------Author:SanYue------------------------" <<std::endl; void* context=zmq_init(1); //指定zmq 处理I/0事件的thread pool 为1 void* z_socket=zmq_socket(context,ZMQ_REQ); zmq_connect(z_socket,"tcp://localhost:5555"); // accept connections on a socket for(int i=0;i<9;i++) //循环工作 { system("pause"); //暂停 //发送部分 zmq_msg_t send_msg; zmq_msg_init_size(&send_msg,6); memcpy(zmq_msg_data(&send_msg),"hello",6); zmq_msg_send(&send_msg,z_socket,0); zmq_msg_close(&send_msg); //接受部分 zmq_msg_t recv_msg; zmq_msg_init(&recv_msg); zmq_msg_recv(&recv_msg,z_socket,0); //0表示非阻塞 printf("收到Server端回答:\t"); std::cout<<(char*)zmq_msg_data(&recv_msg)<<std::endl; zmq_msg_close(&recv_msg); } zmq_close(z_socket); zmq_term(context); return 0; }
这是 REP/REQ 请求/回应模式的尝试,这种模式必须同时有 recv 和 send,具体会在下一篇讲。