CMSG 是遵从 ANSI C 规范实现的通信协议,原则上,CMSG 可以基于任何支持以流(stream)的形式操作的传输层,如串口,tcp,fifo 等。可以利用 CMSG 实现 IPC 或远程通信/调用。
/- serial port -\
data <-> CMSG <-> -|- tcp/udp/uds -| <-> CMSG <-> data
\- ... -/
CMSG 用于短数据的传输。CMSG 的单个数据包结构包括 length,type,data 和 sum 字段。它们分别是数据包的长度,数据包的类型,数据包的数据和校验和。
length | type | data | sum
length 是使用小端序存储的 8/16/32 位无符号整数,它表示整个数据包(包括 length,type,data 和 sum)的大小,可与通过CMSG_LEN_WIDTH
控制。
type 是 8 位无符号整数,表示数据包的类型,其值由用户定义。
data 是数据包传输的数据,其内容由用户定义。
sum 是 8 位无符号整数,它是数据包的校验和(使用 BCC 校验)。
CMSG 是单头文件(single header)库,引入 cmsg.h
即可,在需要 API 实现的场合,应首先定义宏 CMSG_IMPL
。
通常,CMSG 是有应答机制的,即数据的发送方会受到接收方回复的数据,在基于 UDP 的通信场景下,发送端往往不要求接收端应答,通过定义宏 CMSG_NO_ACK
禁用 CMSG 的应答机制。