1.下载zmq库包
参考官网:Release v4.0.4 · zeromq/libzmq · GitHub
2.编译zmq库
2.1找到路径下的msvc.sln:
2.2用VS010打开并生成libzmq工程:
2.3生成lib、.dll如下:
我是专门新建了文件夹,归档放置zmq的头文件、库文件和动态文件。
3.测试
3.1项目属性
1)项目均为win32控制台空项目;
2)属性→c/c++→预处理器→预处理器定义中,将"_WINDOWNS"改为“_CONSOLE”:
3)熟悉→链接器→系统→子系统,改为“控制台(/SUBSYSTEM:CONSEOLE)”:
4)添加头文件和库的引用路径等:
3.2应答模式测试
3.2.1新建zmqServer
//2014-4-2 programed by sixbeauty
//zeromp 通讯测试server 端
#include "zmq.h"
#include "zmq_utils.h" //Zeromq 函数的导入在这里帮我们实现了
#include <iostream>
#pragma comment(lib,"libzmq.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"<<recvn++<<"\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;
}
3.2.2新建zmqClient
//2014-4-2 programed by sixbeauty
//zeromp 通讯测试client 端
#include "zmq.h"
#include "zmq_utils.h" //Zeromq 函数的导入在这里帮我们实现了
#include <iostream>
#pragma comment(lib,"libzmq.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;
}
3.2.3运行
将zmq.dll放置在exe目录下,执行服务端和客户端的exe:
参考说明:
库版本和测试代码主要参考链接:
Windows下 Zmq v4.0.4的使用 (C++) - 不笑猫 - 博客园 (cnblogs.com)
补充更新:
3.3发布订阅模式测试
3.3.1新建zmqServer
//订阅模式
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <process.h>
#include <assert.h>
#include <string.h>
#include <zmq.h>
int main()
{
printf("Hello world!\n");
void* context = zmq_ctx_new();
assert(context != NULL);
int ret = zmq_ctx_set(context, ZMQ_MAX_SOCKETS, 1);
assert(ret == 0);
void* publisher = zmq_socket(context, ZMQ_PUB);
assert(publisher != NULL);
ret = zmq_bind(publisher,"tcp://*:5555");
assert(ret == 0);
while(1)
{
ret = zmq_send(publisher, "Hi,I'm server", 16, 0);
assert(ret == 16);
printf("%d\n", ret);
//sleep(1);
}
printf("1\n");
return 0;
}
3.3.2新建zmqClient
//订阅模式
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <process.h>
#include <assert.h>
#include <zmq.h>
int main()
{
printf("Hello world!\n");
void* context = zmq_ctx_new();
assert(context != NULL);
int ret = zmq_ctx_set(context, ZMQ_MAX_SOCKETS, 1);
assert(ret == 0);
void* subscriber = zmq_socket(context, ZMQ_SUB);
assert(subscriber != NULL);
ret = zmq_connect(subscriber,"tcp://localhost:5555"); ;
assert(ret == 0);
ret = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0);
assert(ret == 0);
char buf[16];
while(1)
{
ret = zmq_recv(subscriber, buf, 16, ZMQ_DONTWAIT);
if (ret != -1)
{
buf[ret] = '\0';
printf("%s\n", buf);
}
//sleep(1);
}
return 0;
}
3.3.3运行
3.4推送模式测试
3.4.1新建推送端
//分发者 ventilator
#include <zmq.h>
#include <stdio.h>
#include <io.h>
#include <process.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
void * context = zmq_ctx_new();
void * sender = zmq_socket(context, ZMQ_PUSH);
zmq_bind(sender, "tcp://*:6666");
printf ("Press Enter when the workers are ready: ");
getchar ();
printf ("Sending tasks to workers...\n");
while(1)
{
const char * replyMsg = "World";
zmq_send(sender, replyMsg, strlen(replyMsg), 0);
printf("[Server] Sended Reply Message content == \"%s\"\n", replyMsg);
}
zmq_close(sender);
zmq_ctx_destroy(context);
return 0;
}
3.4.2新建执行端
//执行者 worker
#include <zmq.h>
#include <stdio.h>
#include <io.h>
#include <process.h>
#include <string.h>
#include <assert.h>
int main(void)
{
void * context = zmq_ctx_new();
void * recviver = zmq_socket(context, ZMQ_PULL);
zmq_connect(recviver, "tcp://localhost:6666");
void * sender = zmq_socket(context, ZMQ_PUSH);
zmq_connect(sender, "tcp://localhost:5555");
while(1)
{
char buffer [256];
int size = zmq_recv (recviver, buffer, 255, 0);
if(size < 0)
{
return -1;
}
printf("buffer:%s\n",buffer);
const char * replyMsg = "World";
zmq_send(sender, replyMsg, strlen(replyMsg), 0);
printf("[Server] Sended Reply Message content == \"%s\"\n", replyMsg);
}
zmq_close(recviver);
zmq_close(sender);
zmq_ctx_destroy(context);
return 0;
}
3.4.3新建接收端
//收集结果的接收者 sink
#include <zmq.h>
#include <stdio.h>
#include <io.h>
#include <process.h>
#include <string.h>
#include <assert.h>
int main(void)
{
void * context = zmq_ctx_new();
void * socket = zmq_socket(context, ZMQ_PULL);
zmq_bind(socket, "tcp://*:5555");
while(1)
{
char buffer [256];
int size = zmq_recv (socket, buffer, 255, 0);
if(size < 0)
{
return -1;
}
printf("buffer:%s\n",buffer);
}
zmq_close(socket);
zmq_ctx_destroy(context);
return 0;
}
3.4.4运行
推送端将要执行的命令发给执行端,由多个执行端执行指令并将结果发给接收端。
推送测试代码参考: