zmq源码阅读 —— zmq_send()和zmq_recv()
来源:互联网 发布:windows共享文件夹密码 编辑:程序博客网 时间:2024/06/09 17:38
int zmq_recv (void *s_, void *buf_, size_t len_, int flags_){ if (!s_ || !((zmq::socket_base_t*) s_)->check_tag ()) { errno = ENOTSOCK; return -1; } zmq_msg_t msg; // 创建消息结构 int rc = zmq_msg_init (&msg); // 初始化空消息 errno_assert (rc == 0); zmq::socket_base_t *s = (zmq::socket_base_t *) s_; int nbytes = s_recvmsg (s, &msg, flags_); // 接收消息 if (unlikely (nbytes < 0)) { int err = errno; rc = zmq_msg_close (&msg); errno_assert (rc == 0); errno = err; return -1; } // At the moment an oversized message is silently truncated. // TODO: Build in a notification mechanism to report the overflows. size_t to_copy = size_t (nbytes) < len_ ? size_t (nbytes) : len_; //计算消息大小 memcpy (buf_, zmq_msg_data (&msg), to_copy); // 通过zmq_msg_data()获得消息的data地址,拷贝到buf_中 rc = zmq_msg_close (&msg); // 释放或销毁消息 errno_assert (rc == 0); return nbytes;}---------------------------------------------------------------------int zmq_recvmsg (void *s_, zmq_msg_t *msg_, int flags_){ return zmq_msg_recv (msg_, s_, flags_);}----------------------------------------------------------------------int zmq_msg_recv (zmq_msg_t *msg_, void *s_, int flags_){ if (!s_ || !((zmq::socket_base_t*) s_)->check_tag ()) { errno = ENOTSOCK; return -1; } zmq::socket_base_t *s = (zmq::socket_base_t *) s_; int result = s_recvmsg (s, msg_, flags_); return result;}-----------------------------------------------------------------------static ints_recvmsg (zmq::socket_base_t *s_, zmq_msg_t *msg_, int flags_){ int rc = s_->recv ((zmq::msg_t*) msg_, flags_); if (unlikely (rc < 0)) return -1; return (int) zmq_msg_size (msg_);// 计算消息的大小}---------------------------------------------------------------------------------=================================================================================---------------------------------------------------------------------------------int zmq_send (void *s_, const void *buf_, size_t len_, int flags_){ if (!s_ || !((zmq::socket_base_t*) s_)->check_tag ()) { errno = ENOTSOCK; return -1; } zmq_msg_t msg; // 创建消息结构 int rc = zmq_msg_init_size (&msg, len_); // 以buf长度初始化成消息 if (rc != 0) return -1; memcpy (zmq_msg_data (&msg), buf_, len_); // 将buf的内容拷贝给消息 zmq::socket_base_t *s = (zmq::socket_base_t *) s_; rc = s_sendmsg (s, &msg, flags_); // 发送消息 if (unlikely (rc < 0)) { int err = errno; int rc2 = zmq_msg_close (&msg); // 释放和销毁消息 errno_assert (rc2 == 0); errno = err; return -1; } // Note the optimisation here. We don't close the msg object as it is // empty anyway. This may change when implementation of zmq_msg_t changes. return rc;}从注释中可以看出消息发送的流程,czmq,jzmq等已经做了封装,也可以自己做封装。
0 0
- zmq源码阅读 —— zmq_send()和zmq_recv()
- zmq源码阅读——Msg.hpp & Msg.cpp 的 相关操作 (zmq中的消息)
- zeromq源码阅读 —— Msg.hpp & Msg.cpp 的 msg_t (zmq中的消息)
- zmq_send
- zmq_recv
- ZMQ——VS2012
- Linux——ZMQ-zmq_socket
- ZMQ源码分析(三)--对象管理和消息机制
- ZMQ源码分析(六)--编码器和解码器
- 阅读源码利器—ctags的安装和配置
- Linux——ZMQ环境搭建
- ZMQ——多线程通信(过程)
- ZMQ——注意的问题
- SLF4j——源码阅读
- 源码阅读—String equals()
- ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究
- ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究
- ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究
- Core Location和MapKit的一些简单使用
- cocos2dx3.2 异步加载和动态加载
- angular-phonecat 项目无法启动
- poppler 之介绍文章
- Linux常用命令行选项的含义
- zmq源码阅读 —— zmq_send()和zmq_recv()
- java中反射学习整理
- 51 talk immersion notes
- Android基础之——MacOSX下elipse开发环境的配置
- VC6.0快捷键说明
- STM32固件库详解
- Matrix Power Series(乘法矩阵)
- APUE笔记五
- UML中的几种关系