1. 协议中的数据结构
1. 1nn_chunk
nn_chunk对分配的内存空间做记录工作。
nn_chunk_alloc()其实并不返回nn_chunk实例。它分配一块内存,以便容纳nn_chunk结构和真正的数据。nn_chunk在内存开始位置,真正的数据紧接在其后(准确的说法是中间还隔着两个分割符)。返回给调用者的是真正数据的地址。
1.2 nn_chunkref
nn_chunkref用来保存一块内存空间。 为了容易设置它,还定义了另一个结构nn_chunkref来操作它。
如果内存空间小于32, 则在ref[0](也就是tag成员)中保存空间大小,ref[]后面的空间保存数据;如果内存空间大于等于32,则ref[0]的值设置为0xFF,用malloc()分配空间,地址保存在ref[]中(实际上是chunk成员)。
nn_chunkref_init()用于初始化nn_chunkref,它使用nn_chunk_alloc()分配所需的内存。
1.3 nn_msg
nn_msg由多个nn_chunkref组成。Sphdr和hdrs保存消息的头部信息,如消息的hop信息。 body保存数据部分。
在xrep模式中,sphdr还用来保存in-pipe的编号,以便回复消息时,能知道该回复到哪个pipe。
1.4 nn_msghdr
nn_msg在nanomsg内部使用,而nn_msghdr是提供给用户的接口。
msg_control保存消息头部信息。它与nn_msg的sphdr和hdrs对应。
msg_iov[]保存消息数据,它是一组内存空间,每个空间保存在一个nn_iovec实例中。msg_iovlen是msg_iov[]的大小。这样的设计在gatter array情形下可以避免数据拷贝,否则msg_iovlen就是1。
msg_iov[]与nn_msg的body对应。
相关链接
nanomsg 1.1.5 源代码分析 (一)
nanomsg 1.1.5 源代码分析 (二)
nanomsg 1.1.5 源代码分析 (三)
nanomsg 1.1.5 源代码分析 (四)