Message Channel是一种基于Socket的面向连接的通信机制。Task以Message的形式交换数据,Message的大小和格式可变,一旦建立连接,它们可以在全双工模式下来回传递
单机模式的Message Channel基于COMP实现,其速度略慢于Message Queue,但具有显著的优势(应用程序的可移植性,以供多节点Message Channel使用等),支持Kernel/RTP之间的Task通信
COMP(Connection-Oriented Message Passing)协议使用标准的Socket API,Domain为AF_LOCAL,Type为SOCK_SEQPACKET
COMP基于连接,类似于TCP,携带变长消息,类似于UDP,但是使用时并不依赖TCP/IP协议栈。它使用一个类似于文件路径的string做为地址,地址格式必须是/comp/socket/0xabcd,abcd为十六进制数,取值范围是0x1 - 0xffff,即1 - 65535
要想使用COMP,在VIP中包含组件INCLUDE_UN_COMP_SHOW,然后使用Socket API即可:socket()、bind()、listen()、accept()、connect()、read()、write()、send()、recv(),以及getsockopt()、setsockopt()、ioctl(),还有select()
send()就是在write()的基础上增加了一个flag: MSG_EXP,类似于Message Queue里的MSG_PRI_URGENT
recv()就是在read()的基础上增加了两个flag: MSG_PEEK和MSG_DONTWAIT
getsockopt()/setsockopt()支持四种Option: SO_SNDBUF、SO_RCVBUF、SO_SNDTIMEO、SO_RCVTIMEO
ioctl()支持两种Function Code: 类似于MSG_PEEK的FIONREAD和类似于MSG_DONTWAIT的FIONBIO
查看COMP连接,使用unstatShow()
简单对比一下Message Channel和Message Queue
Message Channel | Message Queue |
---|---|
面向连接 | 非面向连接 |
双向 | 单向 |
Message长度可变 | Message长度固定 |
Message数量无限制 | Message数量固定 |
位置透明 | Public Object支持RTP通信 |
使用Socket API | 专用API |
支持IO操作:select()/read()/write/ioctl()/close() | 不支持IO操作 |