因为工作需要,需要设计出一个双工的IPC。在一番比较后,我发现管道是比较符合我们的需求的。但是我们需求要求管道的对方是可信任的,而在vista以下系统是没有GetNamedPipeClientProcessId、GetNamedPipeClientSessionId、GetNamedPipeServerProcessId、
GetNamedPipeServerSessionId这样的函数,于是是否可信这个操作就要求由客户端和服务端两方互检来完成,至于互检的思路,我会在之后管道的加强版中给出思路和例子。而本文只是简单介绍一个同步双工管道。
在工作中写的管道模型中,服务端每次被连接上,都会启动一个连接实例(线程)。于是如果存在多个客户端接入的情况下,将启动多个线程。这样的模型比较简单,但是效率存在问题。这些天我参考了微软的例子,重写了管道模型。服务端只启动一个线程,利用该线程的APC完成所有连接的读写操作。因为是同步双工,所以我设计的模型是不停的一问一答。当有消息要发向对方时,只需要向“问”列表中插入消息,底层会将这条消息发往对方;如果“问”表中不存数据,则发一条垃圾消息,对方在接受到这条消息后不做任何处理。这样的设计也就是为了维持管道畅通,不因一个环节卡住导致其他操作不可完成。
对于管道模型,我设计成:传输层,数据层,逻辑层,应用层四层结构。其中传输层只负责管道连接和数据传输,不关心数据内容;数据层会将传输层所有取到的数据以管道句柄为依据进行分组,同时负责将各个连接要传给对方的数据汇总供传输层使用;逻辑层考虑加入验证逻辑,即验证对方是否为可信任,同时为应用层提供方便的调用支持,比如在逻辑层启动一个线程调用一个应用层设置的回调函数来处理接受到的消息,同时暴露一个发送数据的函数供应用层使用。这样应用层只要实现处理消息的回调、调用发送数据的接口即可。(工作中设计的管道模型就是这样子的。因为我准备重写一个更稳定和高效的管道,目前只大致写好了传输层代码。)
服务端
客户端
这个代码中的一些值得注意的设计:
1 在写完成例程中调用异步读,在读完成例程中调用异步写,从而实现同步双工。(特别注意不要在完成例程中的异步操作后WaitforXXEX,否则会出现严重的递归问题,最后内存耗尽,程序挂掉)
2 对每一个接入,都分配一个不可移动的内存,其第一个元素设置成OVERLAPPED结构对象,同时让这个结构对象就是异步操作和完成例程中都会使用的那个参数。如异步操作
完成例程
这样设计,就可以达到一个很重要的目的:在完成例程中获取“读/写”的数据。
对应的工程地址是:CommunicatePipe工程
分享到:
相关推荐
http://blog.csdn.net/breaksoftware/article/details/7001672文中的工程
服务端与客户端通过命名管道实现通信,收发均在子线程完成。
移动通信的双工方式 根据信息的传送方向,通信可以分为单工、半双工和全双工三种方式 信息只能单向传送为单工; 信息能双向传送但不能同时双向传送称为半双工; 信息能够同时双向传送则称为全双工。 1.FDD:频分双工...
4.4 全双工管道 37 4.5 popen和pclose函数 39 4.6 FIFO 40 4.7 管道和FIFO的额外属性 44 4.8 单个服务器,多个客户 46 4.9 对比迭代服务器与并发服务器 50 4.10 字节流与消息 51 4.11 管道和FIFO...
Windows 的IPC(进程间通信)机制主要是异步管道和命名管道。(至于其他的IPC方式,例如内存映射、邮槽等这里就不介绍了) 管道(pipe)是用于进程间通信的共享内存区域。创建管道的进程称为管道服务器,而连接到这...
gayrpc:全双工C ++ RPC库,使用Protobuf,支持HTTP API
WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#WCF双工通信 C#
案例四:java网络编程 双工通讯(带界面)
本书全面深入地讲解了各种进程间通信形式,包括消息传递、同步、共享内存及远程调用(RPC)。书中包含了大量经过优化的源代码,帮助读者加深理解。这些源代码可以从图灵网站本书网页免费注册下载。本书是网络研究和...
ssb-exchange:通过双工流完全同步两个安全scuttlebutt数据库
拆分双工对象流介绍多重双工流 安装 npm install nspoint 例子 您有一个双工transport套接字,其中接收和输出对象使用nspoint将其包装在每一端,以通过名称空间将其拆分。 var nspoint = require ( 'nspoint' ) ...
传输 HV1、HV2、HV3 和 SCORT [1] 语音包和 DM1 数据包的全双工蓝牙通信链路的 Simulink:registered: 和 Stateflow:registered: 模型。 系统参数块配置整个模型的数据包类型、槽对和通道类型。 Stateflow 用于实现...
TDDUnitTesting 在这个资料库中,我研究了TDD和单元测试
TDD-示例
“双工”示例演示如何定义和实现双工协定。 当客户端与服务建立会话并为服务提供可用来将消息发送回客户端的通道时,就会发生双工通信。
json-duplex-stream 用换行符分隔的JSON双工流安装$ npm i json-duplex-stream --save要求var JSONDuplexStream = require ( 'json-duplex-stream' ) ;实例化var stream = JSONDuplexStream ( ) ;管道管道输入stream...
将正交频分复用与索引调制相结合,提出了一个全双工正交频分复用索引调制中继通信系统。采用最大似然检测方法估计了接收到的正交频分复用数据块,推导出通信故障中断概率、误块率和端到端容量的表达式,通过蒙特卡罗法...
LabVIEW实现多上位机,单下位机的全双工TCP通讯。
双工发射器 将双工流转换为事件发射器。 例如,当您使用它连接 TCP 服务器和 TCP 客户端时,当客户端发出时,事件会传播到服务器,反之亦然。创造 var s = net . connect ( ... ) ;var duplexEmitter = require ( '...
最新单片机仿真 485全双工通信最新单片机仿真 485全双工通信最新单片机仿真 485全双工通信最新单片机仿真 485全双工通信最新单片机仿真 485全双工通信最新单片机仿真 485全双工通信最新单片机仿真 485全双工通信最新...