一、QNX消息概述

  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);