从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161

1. 频道与连接
    Channel, Connect
    
    server:
        ChannelId = ChannelCreate(Flags);
    client:
        ConnectionId = ConnectAttach(Node, Pid, Chid, Index, Flag);
        Node: 机器号; Pid是服务进程号; Chid就是ChannelCreate后得到的频道号.
    连接的终止是ConnectDetach(),而频道的结束则是ChannelDestroy()了。不过,一般服务器都是长久存在的,不大有需要ChannelDestroy()的时候。
2.     发送,接收与应答
    Send, Receive, Reply

server:
        RecieveId = MsgReceive(ChannelId, ReceiveBuffer, ReceiveBufLength,&MsgInfo);
        ...Deal Recvd Msg....
        MsgReply(ReceiveId, ReplyBuf, ReplyLen);    
        
    client:
        MsgSend(ConnectionId, SendBuf, SendLen, ReplyBuf, ReplyLen);
        ....然后由OS将这个线程挂起...
        ....当服务器MsgReply()后,OS解除线程阻塞状态,客户端可以检查自己的ReceiveBuf看看应答效果...
        
3. 数据区与iov
虽然在客户端Header同databuf是两块不相邻的内存,但传递到服务器端的ReceiveBuffer里,就是连续的了。

客户端: "header" 与 "databuf" 是不连续的两块数据。
    SETIOV(&iov[0], &header, sizeof(header));
    SETIOV(&iov[1], databuf, datalen);
    MsgSendvs(ConnectionId, iov, 2, Replybf, ReplyLen);

服务器: 接收后,"header"与"databuf"被连续地存在ReceiveBuffer里。
    ReceiveId = MsgReceive(ChannelId, ReceiveBuffer, ReceiveBufLength, &MsgInfo);
    header = (struct header *)ReceiveBuffer;
    databuf = (char *)((char *)header + sizeof(*header));
    当指定的ReceiveBufLength小于实际收到的字节数,即MsgReceive不一定读完了所有来自client的数据,因此还需要查看MsgInfo,并使用MsgRead(ReceiveId,
                                ReceiveBuffer+ReceiveBufLength, // 指定存数据buffer起始地址
                                ReceiveBufLength, // 去缓冲区读数据时候的偏移量
                                MsgInfo->srcmsglen - MsgInfo->msglen    // 未读取完的数据长度    
                            ));

最新文章

  1. ABP文档 - 后台作业和工作者
  2. 关于c++风格 code style
  3. 20145211 《Java程序设计》第10周学习总结——昨夜星辰昨夜风
  4. 使用DDMS测试安卓手机APP的性能(android)
  5. 关于windows中的任务管理调度器
  6. WPF窗体置于桌面最底层
  7. Bash 字符串处理命令
  8. VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
  9. global,local,static的区别
  10. (NO.00002)iOS游戏精灵战争雏形(十一)
  11. 一文读懂四种常见的XML解析技术
  12. 初步学习python
  13. [HNOI2018]寻宝游戏
  14. easyui修改提示窗
  15. hint之qb_name
  16. 把AVI存在资源中用TAnimate播放
  17. DATASNAP远程方法返回TSTREAM正解
  18. 洛谷 P1941 飞扬的小鸟
  19. php -- 魔术方法 之 自动加载:__autoload()
  20. 《iOS Human Interface Guidelines》——Popover

热门文章

  1. SQL 设计心得、逗号分隔列表
  2. 普通内存、ECC内存和REG ECC内存有什么不同
  3. HDU 5768 Lucky7(CRT+容斥原理)
  4. 某IT校招笔试
  5. unity3d插件Daikon Forge GUI 中文教程-5-高级控件listbox和progress bar的使用
  6. ORA-600 [kcratr_scan_lastbwr] 逻辑坏块
  7. SQL Server索引进阶:第六级,标签
  8. Jquery开发插件的方法
  9. Ajax异步请求XMLHttpRequest对象Get请求
  10. CXF详细介绍