QNX消息可以分为同步消息和异步消息。异步(脉冲)消息主要体现的是一种通知机制,同步消息主要是说消息在传递过程需要双方相互配合的过程。
二、QNX消息传递几个基本概念
1、频道与链接
消息传递是基于服务器与客户端的模式来进行的,QNX6抽象出了”频道“(Channel)这个概念。一个频道,就是一个服务的入口;至于这个频道到底具体有多少线程为其服务,那都是服务器端自己的事情。一个服务器如果有多个服务,它也可以开多个频道。而客户端,在向“频道”发送消息前,需要先建立连接(Connection),然后将消息在连接上发出去。这样同一个客户端,如果需要,可以与同一个频道建立多个连接。
2、名字空间(name_space)
在客户端与服务器通信中,为了让客户端方便的知道服务器的nd/pid/chid, 服务器进程可以注册一个路径名,与服务频道的nd, pid, chid关联起来。客户端就只要请求连接版务器路径名就可以了。
三、QNX同步信号下客户端服务器通信
1、客户端模型
1)调用name_open(PATH)连接到服务器频道获得一个连接ID
3)调用API发送消息等待服务器应答
4)收到应答完毕调用name_close()关闭连接
2、服务器模型
1)调用name_attach注册一个名字空间并且创建一个频道
2)接收并处理消息
3)应答消息处理结果
4)name_detach从名字空间删除该名称
3、客户端服务器消息传递过程
1)服务器注册一个名字空间等待客户端连接
2)客户端连接到名字空间
3)客户端调用MsgSend接口给服务器发送消息,客户端处于发送阻塞
4)服务器调用MsgReceive接口接收数据,客户端处于应答阻塞
5)服务器处理完毕消息,调用MsgReply函数发送应答消息
6)客户端从MsgSend函数返回,解除阻塞
4、利用多路消息传递提高效率
用iov_t来“汇集”数据。也就是说,可以一次传送几块据。Header同databuf是两块不相邻的内存,但传递到服务器端的ReceiveBuffer里,就是连续的了。
SETIOV(&iov[0], &header, sizeof(header));
SETIOV(&iov[1], databuf, datalen);
MsgSendvs(ConnectionId, iov, 2, Replybf, ReplyLen);
5、消息传递的方向与MsgDeliverEvent()
客户端给服务器发送消息,服务器不能立刻应答而客户端不想等待。遇到这种情况,正确的做法是,告诉客户端,请求一段时间后会得到处理,客户端得以继续运行,一旦服务器完成任务,服务器需要一些方式告诉客户端请求完成。
客户端: 准备一个“通知事件”(Notification Event),并把这个事件用MsgSend()发给服务器端,意思是:“如果xxx情况