zmq+VS010库编译及测试

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运行

推送端将要执行的命令发给执行端,由多个执行端执行指令并将结果发给接收端。

推送测试代码参考:

ZeroMQ使用教程_zeromq当第一条消息发送失败后,第二条消息可不可以成功发送-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值