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()接收信息。
本文详细介绍了ZeroMQ中的关键类,如context_t、message_t和socket_t,并通过一个client.cpp示例展示了如何利用REQ-REP模型进行消息通信。在示例中,首先创建context_t,接着创建socket_t并绑定到5555端口,然后通过send和recv函数实现消息的发送与接收。
&spm=1001.2101.3001.5002&articleId=106511145&d=1&t=3&u=b91074da0e0a47d0a1191ce686f8e1f7)
1675

被折叠的 条评论
为什么被折叠?



