这次来谈谈ZeroMQ—基于消息队列的多线程网络库(二)

本文详细介绍了ZeroMQ中的关键类,如context_t、message_t和socket_t,并通过一个client.cpp示例展示了如何利用REQ-REP模型进行消息通信。在示例中,首先创建context_t,接着创建socket_t并绑定到5555端口,然后通过send和recv函数实现消息的发送与接收。

 ZeroMQ主要是有一个命名空间zmq。其下包含着很多类。zmq.hpp中主要的类有:

  • context_t

  • message_t

  • socket_t

  • monitor_t

  • error_t

    其中context_t、message_t都有一个友元类socket_t。

socket_t有一个友元类monitor_t。

    开始讲解用代码例子来讲解:

REQ-REP模型:

client.cpp

//  Hello World client
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main (void)
{
    printf ("Connecting to hello world server…\n");
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");

    int request_nbr;
    for (request_nbr = 0; request_nbr != 10; request_nbr++) {
        char buffer [10];
        printf ("Sending Hello %d…\n", request_nbr);
        zmq_send (requester, "Hello", 5, 0);
        zmq_recv (requester, buffer, 10, 0);
        printf ("Received World %d\n", request_nbr);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}
//  Hello World server in C++
//  Binds REP socket to tcp://*:5555
//  Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <string>
#include <iostream>
#ifndef _WIN32
#include <unistd.h>
#else
#include <windows.h>
#define sleep(n)    Sleep(n)
#endif
int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        //  Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;

        //  Do some 'work'
        sleep(1);

        //  Send reply back to client
        zmq::message_t reply (5);
        memcpy (reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

    zmq::context_t context (1);创建一个context_t 类。

使用zmq::context_t context也行。

    该类有3个构造函数,其中一个是移动语义。本质上是为了使用zmq_ctx_new()去创建一个指针。只不过带参数的构造函数会使用zmq_ctx_set()函数。

//不带参构造函数context_t ();//传入io_threads_(IO线程的ID)和max_sockets_(最大连接数)context_t (int io_threads_, int max_sockets_ = ZMQ_MAX_SOCKETS_DFLT);//移动语义context_t (context_t &&rhs) ZMQ_NOTHROW : ptr (rhs.ptr);

zmq::socket_t socket:

    创建一个socket_t类。该类有3个构造函数,其中一个是移动语义。本质上是为了使用zmq_ctx_new()去创建一个指针。只不过带参数的构造函数会使用zmq_ctx_set()函数。

     ZMQ_REQ、ZMQ_REP分别对应枚举中的0和1.

 

socket_t(context_t& context_, int type_);
socket_t(context_t& context_, socket_type type_);
socket_t(socket_t&& rhs) ZMQ_NOTHROW : ptr(rhs.ptr);

构造函数都是使用传入的context然后调用init()函数进行初始化指针*ptr和*ctxptr。

 

 

zmq::message_t request:

    创建一个message_t类。该类有6个构造函数和一个移动语义构造函数。构造函数过多。请自己查阅。主要就是为了存储信息。

    socket.bind ("tcp://*:5555"); 就是调用socket.bind()函数在TCP/IP协议上绑定端口5555。

    socket.send()发送消息。

    socket.recv()接收信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值