我是靠谱客的博主 伶俐台灯,最近开发中收集的这篇文章主要介绍全网仅此一篇!万字详解ZeroMQ的zmq_msg_t消息处理、多部分消息、及消息接口一、ØMQ的消息处理二、多部分消息三、接口使用的几点说明四、zmq_msg_t结构及源码分析五、初始化空的ØMQ消息(zmq_msg_init)六、初始化指定大小的ØMQ消息(zmq_msg_init_size)七、从缓冲区中初始化ØMQ消息(zmq_msg_init_data)八、释放ØMQ消息(zmq_msg_close)九、设置/获取消息属性(zmq_msg_set、zmq_msg_get)十、获取消息元,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、ØMQ的消息处理
使用套接字来传输数据
- 但ØMQ的I/O模型与TCP模型有很大区别,你需要时间来转变观念。
- 处理数据时,TCP套接字和ØMQ套接字之间的差异:
- ØMQ套接字像UDP那样传递信息,而不是像TCP那样传递字节流。ØMQ消息是指定长度的二进制数据,因为它们的设计针对性能进行了优化,所以有点棘手
- ØMQ套接字在一个后台线程执行自己的IO。这意味着消息到达本地输入队列并从本地输出队列被发送,不会影响到你的应用程序运行
- ØMQ套接字根据套接字类型具有内置的1对N的路由行为
zmq_msg_xxx()消息处理接口
- 在内存中,ØMQ消息是zmq_msg_t表示的结构(或类,取决于你采用的语言)
- 下面是C语言中使用ØMQ消息的基本规则:
- 创建并创建zmq_msg_t对象,使用zmq_msg_t来表示消息,而不是使用普通的数据块(char*)来交互数据
- 要读取消息,可使用zmq_msg_init()创建一个空的消息,然后传递给zmq_msg_recv()
- 要写入消息,可以使用zmq_msg_init_size()来创建消息,并分配某个大小的数据块数据,使用memcpy()将数据块的数据拷贝给zmq_msg_t,然后将zmq_msg_t传递给zmq_msg_send()进行发送
- 要释放消息,则调用zmq_msg_close(),这会删除一个引用,当消息引用为0时,ØMQ会最终自动帮你销毁该消息
- 要访问消息内容,可以使用zmq_msg_data()
- 要知道消息包含多少数据,可以使用zmq_msg_size()
- 一般不建议使用zmq_msg_move()、zmq_msg_copy()、zmq_msg_init_data(),除非你的目标很明确就是要用这些函数
- zmq_msg_send()传递一个消息时候,会把该消息清除(把它的大小设置为0),因此消息发送之后需要关闭(zmq_msg_close())并且不再使用。如果你想多次发送相同的数据,可以创建两个zmq_msg_t消息对象发送,或者在调用zmq_msg_init()之前使用zmq_msg_copy()拷贝两份一样的数据并同时发送
- 此处给出的只是个大概,更多的细节参阅下面的接口介绍和演示案例
ØMQ对字符串的处理
- 在前面的文章我们介绍了如何处理ØMQ的字符串并封装了下面两个字符串处理函数,文章可以参阅:https://blog.csdn.net/qq_41453285/article/details/105991716
- 下面是自定义的两个函数:
- 一个是字符串接收函数:其从网络中接收一个ØMQ字符串,并申请多1个字节空间的内存保存该字符串,然后在尾部要添加0,以终止该字符串
- 一个是字符串发送函数:向网络中发送一个字符串,单发送的字符串不含尾部的空字符
// 从套接字接收ØMQ字符串,并将其转换为C/C++字符串(在尾部添加0)
static char *s_recv(void* socket)
{
// 此处使用zmq_msg_init()初始化即可, zmq_msg_recv()在内部会自动对zmq_msg_t对象进行大小设定
zmq_msg_t message;
zmq_msg_init(&message);
int size = zmq_msg_recv(&message, socket, 0);
if(size == -1)
return NULL;
char *string = (char*)malloc(size + 1);
memcpy(string, zmq_msg_data(&message), size);
zmq_msg_close(&message);
string[size] = 0;
return string;
}
// 将C字符串转换为ØMQ字符串(去掉尾部的'