5、消息传递的方向与MsgDeliverEvent()

  客户端给服务器发送消息,服务器不能立刻应答而客户端不想等待。遇到这种情况,正确的做法是,告诉客户端,请求一段时间后会得到处理,客户端得以继续运行,一旦服务器完成任务,服务器需要一些方式告诉客户端请求完成。

  客户端: 准备一个“通知事件”(Notification Event),并把这个事件用MsgSend()发给服务器端,意思是:“如果xxx情况发生的话,请用这个事件通知我”。

  服务器: 收到这个消息后,记录下当时的rcvid,和传过来的事件,然后应答“好的,知道了”。

  客户端: 因为有了服务器的应答,客户端不再阻塞,可以去做别的事

  ......

  服务器: 在某个时刻,客户端所要求的“xxx情况”满足了,服务器调用 MsgDeliverEvent(rcvid, event);以通知客户端

  客户端: 收到通知,再用MsgSend()发关“xxx 情况的数据在哪里?”

  服务器: 用MsgReply()把数据返回给客户端

  int MsgDeliverEvent (int rcvid,const struct sigevent *event);

  event服务器不需要作修改 rcvid是服务器从客户端接收的。当服务器给客户端应答后,这个id将失去意义。另外MsgDeliverEvent是非阻塞函数。

  6、常用API

ChannelCreate(), ChannelDestroy()
ConnectAttach(), ConnectDetach()
MsgDeliverEvent()
MsgError()
MsgRead(), MsgReadv()
MsgReceive(), MsgReceivePulse(), MsgReceivev()
MsgReply(), MsgReplyv()
MsgSend(), MsgSendnc(), MsgSendsv(), MsgSendsvnc(), MsgSendv(),
MsgSendvnc(), MsgSendvs(), MsgSendvsnc()
MsgWrite(), MsgWritev()
name_attach(), name_close(), name_detach(), and name_open()

  7、总结

  1)客户端在给服务发送消息的时候指定服务器应答缓冲区

  2)服务器给客户端应答消息(MsgReply)的时候传递参数作为MsgSend返回值

  3)服务器在MsgReceive的时候可以传递参数用于获取客户端发送的消息的一些信息

  4)客户端在打开服务名字空间的时候系统会发送一个_IO_CONNECT 消息给服务器

  5)客户端断开连接或者关闭名字空间的时候服务器会收到_PULSE_CODE_DISCONNECT脉冲

  6)客户端视图从REPLY BLOCK解除阻塞的时候服务器会收到_PULSE_CODE_UNBLOCK脉冲

  7)创建名字空间的时候自动设置了_NTO_CHF_DISCONNECT_NTO_CHF_COID_DISCONNECT 、_NTO_CHF_UNBLOCK 标准,故服务器可以收到对应系统脉冲

  四、通知信号-脉冲

  1、基本概念

  脉冲其实更像一个短消息,也是在“连接”上发送的。脉冲大的特点是它是异步的。发送方不必要等接收方应答,直接可以继续执行。但是,这种异步性也给脉冲带来了限制。脉冲能携带的数据量有限,只有一个8位的"code"域用来区分不同的脉冲,和一个32位“value"域来携带数据。脉冲主要的用途是用来进行“通知”(Notification)。不仅是用户程序,内核也会生成发送特殊的“系统脉冲”到用户程序,以通知某一特殊情况的发生。

  2、接收脉冲

  知道频道上不会有别的消息,只有脉冲的话,可以用MsgReceivePulse()来只接收脉冲;如果频道既可以接收消息,也可以接收脉冲时,直接用MsgReceive(),只要确保接收缓冲(ReveiveBuf)至少可以容下一个脉冲(sizeof struct _pulse)可以了。如果MsgReceive()返回的rcvid是0,代表接收到了一个脉冲,反之,则收到了一个消息。

  3、脉冲信号特点

  1)有效传递40位数据(8位脉冲码,32位数据)

  2)对发送者而言是非阻塞的

  3)可以像其他消息一样被接受

  4)脉冲会排队,只要接受者不是阻塞等待脉冲。

  5)若没有脉冲,则接收者会阻塞等待脉冲