ZMQ专题学习之三:libzmq的请求及应答方式

ZMQ专题学习之三:libzmq的请求及应答方式

       接上一节,简单的展示了调用libzmq的获取dll的版本信息的实例,从这一节开始,针对ZeroMQ的提供的三种方式的服务进行编程学习和代码演示。

    今天展示的是请求应答方式的request-reply模式:

第一步:先建立工程文件,与上一节一样,建立一个testLibzmqReq工程,以控制台的项目方式建立。

第二步:参照上节论述,在建立好的工程文件夹中建立两个目录,include和lib两个文件夹。

然后分别把 zmq.h 和zmq_utils.h拷贝到includes文件夹,libzmq.lib和libzmq.dll拷贝到lib文件夹中。(具体从哪里考,这里就不啰嗦了,对于熟悉vs环境的人,一点就透)。

第三步:设置附加包含目录、附加链接库,调试过dll的人都懂的,不再赘述。

第四步:在建立的工程文件的cpp的文件中,添加如下代码;

// testLibzmqReq.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <string.h>
#include <stdio.h>
//#include <unistd.h>

#include "..\include\zmq.h"

void client_recv_data(void *requester, int bufLen, char *pcRspBuf)
{
    zmq_msg_t reply;
    zmq_msg_init(&reply);
    zmq_msg_recv(&reply, requester, 0);

    memcpy(pcRspBuf, zmq_msg_data(&reply), bufLen);
    zmq_msg_close(&reply);

    return;
}

int main (void)
{
    void *context = zmq_ctx_new();

    // Socket to talk to server
    printf("Connecting to hello world server.\n");
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");

    int request_nbr;
    for (request_nbr = 0; request_nbr != 100; request_nbr++)
    {
        char szSendBuf[10] = {0};
        sprintf(szSendBuf,"Hello_%03d", request_nbr);
        printf("Hello_%03d\n", request_nbr);
        zmq_msg_t request;
        zmq_msg_init_data(&request, szSendBuf, strlen(szSendBuf), NULL, NULL);

        zmq_msg_send(&request, requester, 0);
        zmq_msg_close(&request);
        printf("Sending Hello Times:%d.\n", request_nbr);

        /* recv response d       ata */
        char szRecvBuf[10] = {0};
        client_recv_data(requester, sizeof(szRecvBuf), szRecvBuf);
        printf("Times:%d Received replay:%s\n", request_nbr, szRecvBuf);

        Sleep(1);
    }

    Sleep(2);
    zmq_close(requester);
    zmq_term(context);
    getchar(); 
    return 0;
}

第五步:编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是64位版本的dll和lib库。(本文为64位)

第六步:建立reply的工程文件一个testLibzmqRep工程,以控制台的项目方式建立。

第七步:同样的操作,在建立好的工程文件夹中建立两个目录,include和lib两个文件夹。

然后分别把 zmq.h 和zmq_utils.h拷贝到includes文件夹,libzmq.lib和libzmq.dll拷贝到lib文件夹中。(具体从哪里考,这里就不啰嗦了,对于熟悉vs环境的人,一点就透)。

第八步:设置附加包含目录、附加链接库,调试过dll的人都懂的,不再赘述。

第九步:在建立的工程文件的cpp的文件中,添加如下代码;

// testLibzmqRep.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <stdio.h>
#include <string.h>
#include <iostream>


#include "zmq.h"

void server_recv_data(void *requester, int bufLen, char *pcRspBuf)
{
    zmq_msg_t reply;
    zmq_msg_init(&reply);
    zmq_msg_recv(&reply, requester, 0);

    memcpy(pcRspBuf, zmq_msg_data(&reply), bufLen);
    zmq_msg_close(&reply);

    return;
}

int main ()
{
    // Prepare our context and socket
    void *context = zmq_ctx_new();
    void *responder = zmq_socket(context, ZMQ_REP);
    zmq_bind(responder, "tcp://*:5555");
    printf("Server Received Start");
    while (true)
    {
        char szRecvBuf[10] = {0};
        server_recv_data(responder, sizeof(szRecvBuf), szRecvBuf);

        printf("Server Received data:%s.\n", szRecvBuf);

        Sleep(1);

        // Send reply back to client
        zmq_msg_t reply;
        zmq_msg_init_data(&reply, "World", 6, NULL, NULL);

        //zmq_msg_init_size(&reply, 5);
        //memcpy(zmq_msg_data(&reply), "World", strlen("World"));
        zmq_msg_send(&reply, responder, 0);

        zmq_msg_close(&reply);
    }

    zmq_close(responder);
    zmq_ctx_destroy(context);

    return 0;
}

第十步:编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是64位版本的dll和lib库。(本文为64位)

至此,已经把两个样例工程文件编译完毕,分别在各自的release或者debug目录执行exe文件,执行界面如下:

rep的显示界面

req的显示界面

上面两个图显示了两个程序的相互通信的过程。

demo下载乃地址:https://download.csdn.net/download/jyl_sh/12404593

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyl_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值