现在的位置: 首页 > 综合 > 正文

vc进程通信

2014年02月24日 ⁄ 综合 ⁄ 共 3590字 ⁄ 字号 评论关闭
  • 前言

   
在这里,我主要是概要介绍一下常见的进程通信的相关知识,而没有详细介绍每种进程通信的方式。其原因有二:第一,篇幅有限,当然,这可能是自己懒的借口
(事实如此,很多东西是直接copy来的)。第二,抛砖引玉。个人觉得对于一个程序设计人员来讲,你没必要也不可能学会所有知识,你的关键是优先掌握自己
需要的知识。我介绍的再全面,也不可能完全符合你的要求,到头来你还得继续学习。在这里,我系统初略的介绍只不过是为你打开一扇门,要想领略屋子里的风
景,还得你自己亲自走进去。

  • 进程通信概述

      

     应用程序与应用程序之间通信,叫进程通信。无论这些应用程序是否部署在同一系统上,都是如此。常用的通信方式有以下几种:   

  1. 窗口消息( Windows message),允许与其他应用程序的窗口通信。这与先前用于与自己的应用程序窗口通信所采用的窗口消息是一个概念。
  2. 动态数据交换(DDE: Dynamic Data
    Exchange),通过维护全局分配内存使得应用程序间传递大量数据成为可能。其方式是在一块全局分配内存中手工放置大量的数据,然后使用窗口消息传送
    该内存指针。D D E提供了一种标准使得任何遵守该标准的应用程序都可以采用它。
  3. 消息管道(Message Pipe),用于设置应用程序之间的一条永久通信通道,通过该通道可以像自己的应用程序访问一个平面文件一样读写数据。D D E的数据传送速度使人失望,但是采用消息管道就可以无缝地发送数据到其他应用程序,而这些应用程序可能在其他系统上。
  4. Wi n d o w s套接字( Windows
    Socket),它具备消息管道的所有功能,但遵守一套通信标准使得不同操作系统之上的应用程序之间可以互相通信。这些操作系统可以是非Wi n d
    o w s系统,例如U N I X系统。实际上在开发新的应用程序时,使用Wi n d o w s套接字比消息管道和D D E都更为有利。
  5. I n t e r n e t通信,它让应用程序从I n t e r n e t地址上载或者下载文件。
  6. 串行/并行通信(Serial/Parallel Communication),它允许应用程序通过串行或者并行端口与其他应用程序通信。
  • 通信的步骤

   
前面不是说了,不详细介绍吗?放心,我决不食言(呵呵)。无论是哪种通信方式,基本步骤是不会有太大差别的。就像是吃饭,你用筷子也好,用勺子也好或者是
用手也好,你的第一步都是准备工作,就是想办法把饭弄进嘴里;第二步,开始行动,就是大嚼特嚼,也就是开始吃了;第三步,善后。也就是坐在电脑前消化了。
所以,进程通信步骤也基本如此,大致上是按照三步走的方式(请注意我的措辞,并不是指所有通信步骤都是这简单三步就搞定了):

  1. 用Windows API或者M F C类打开与其他应用程序之间的通信连接。
  2. 读取或者写入对方应用程序。对某些方式而言可能意味着发送及接收消息。对另一些方式,该过程则与读写普通文件没有太大的不同。
  3. 关闭连接
  • 同步方式和异步方式

    每一种通信方式都可以是同步或者异步的。同步( s y n c h r o n o u s
)通信使应用程序暂停,直到它完成对其他应用程序的读或者写操作。异步( a s y n c h r o n o u s
)通信则允许应用程序继续运行,当系统完成读写操作时就会用一个事件标记或者调用指定的函数通知用户任务已经完成。虽然异步通信听起来更为适当,特别是在
应用程序要一次同其他几个应用程序会话的情况下更是如此,但这种方式并不是面向对象的。程序员不是需要跳出对象提供静态回调函数就是需要费心处理事件标
记。同时,设置异步连接也更为复杂,更容易产生程序错误( b u g
)。解决方案是采用同步通信,但要将每个读写操作放进它自己的线程中,这样这些操作就不会再阻止应用程序之间的通信。当操作完成后,线程可以自动地将读取
的数据存回应用程序。当然,它也可以设置事件标记,但这需要在更为友好的M F C类的环境下才可以。

  • 各种通信模式
  1. 窗口消息:利用窗口消息向其他应用程序发送消息实际上是先得到其他应用程序句柄,然后向其发送消息,所以窗口消息也不能跨越不同的计算机。
  2. D D E:允许大量数据通过对全局内存的使用从而在应用程序之间共享。由于全局内存不能通过网络共享,结果D D E也没有了它的前途。
  3. 消息管道:可以建立应用程序间的永久连接并进行通信,就好像是从普通磁盘文件中读写数据。虽然消息管道通信方式比简单消息发送的方式要先进,但最
    好还是把它们都忘了。M F C并不为它们提供任何类,因此在本书中也不提供与之相关的任何实例。消息管道也已经过时了,Windows
    API提供了更灵活的解决方案,那就是Wi n d o w s套接字通信。
  4. Wi n d o w s套接字( Windows Socket):在本质上是遵守B e r k e l e y软件发布(Berkeley Software
    D
    i s t r i b u t i o n,B S D ) ( v 4 . 3 ) U N I
    X套接字实现的消息管道。因此它允许应用程序与在任何支持该标准系统上的应用程序会话。其中当然包括许多U N I X应用程序。虽然Wi n d o
    w
    s套接字一般用于网络通信,但也可以用来实现同一系统上应用程序之间的通信。这样在配置应用程序的时候将具有更大的灵活性。可以将它们安装在所有同样的系
    统上,也可以选择将其安装到其他系统上的另一些应用程序。应用程序可以选用3种级别的Windows 套接字支持,其中包括直接Windows
    API访问、封装了A P I的M F C类C A s y n c S o c k e t以及更高级的其他M F C类C S o c k e
    t。出于简化的原因,应当只使用C S o c k e t。因为C S o c k e t由C A s y n c S o c k e
    t派生,所以然可以访问低级类的所有功能,而且C S o c k e t提供了一些使得与非Wi n d o w
    s系统通信更为方便的功能。采用Wi n d o w
    s套接字的通信由3种套接字完成。除了每个应用程序创建来进行对话的套接字,还有第3类套接字被创建来侦听新的连接。换句话说,当要与其他应用程序建立新
    的连接的时候,每个应用程序都要创建第3个套接字来发信号。
  5. 串行/并行通信:串行和并行通信通常通过系统背后的端口和嵌入设备对话,例如网络节点、打印机或者电话交换机。与这些设备的通信与访问磁盘普通文
    件没有太大不同。实际上使用了同样的MFC CFile类。与一般通信的唯一不同是:这种通信方式在一个线程内完成同步读写并且不会主动读取更多可用字节
  6. Internet通信:有几个M F C类封装了Windows API的Internet
    Extension(Internet扩展功能、Wi n I n e t ),它允许C + +利用下述4种协议之一访问I n t e r n e
    t:文件传送协议(FTP:File Transfer Protocol)、超文本传送协议(HTTP:Hypertext Transfer
    Protocol) 、G o p h e r或者文件形式。可以用M F C的C I n t e r n e t S e s s i
    on类连接到一个I n t e n e t的w e b地址。也可以直接用4种M F C类之一直接访问文件:C S t d i o F i l
    e、C H tt p F i l e、C G o p h e r F i l e或者C I n t e r n e t F i l
    e等。或者用下列3种连接类控制一个w e b站点: C F t p C o n n e c t i o n、C h t t p C o n n
    e c t i o n、C G o p h e r C o n n e c t i o n等。这些文件和连接类都是由C I n t e r n
    e t S e s s i o n类创建的。
  • 通信方式小结

     采用什么通信方式取决于应用程序。例如,有限的通信方式应该采用窗口消息。而对持续或者高级通信则应该使用Wi n d o w s套接字。如果要与嵌入设备,如打印机等通信则要使用串行/并行通信,其余则使用I n t e r n e t通信。

     在新的应用程序开发过程中建议不要采用D D E或者消息管道方式。Wi n d o w
s套接字对进程间通信而言是一种相对灵活得多的解决方案,而且具备支持基础类的相关类。尽管D D E比Windows
Socket的数据通信速度要快,但在一次只通过电缆发送一个字节时就无法替代后者了。

  • 被动通信方式

 到目前为止,已经覆盖了应用程序间主动通信(active communication)的内容,主动通信就是应用程序双方都要参加的通信。应用程序还有两种被动通信方式允许其他应用程序访问其数据,如下所示:

  1. 共享内存文件(Shared Memory File),就是利用前面所讨论的D D E方式使用共同的全局分配内存,因而不能从其他计算机访问。
  2. 文件映射(File Mapping),允许应用程序之间共享文件和内存,甚至通过网络和其他Wi n d o w s计算机之间也可以这样做。

    意如果要与非Windows平台(如UNIX)共享数据,文件映射对此还不能适用。在这种情况下,最好还是使用Wi n d o w
    s套接字。但不要担心,文件映射并不比Wi n d o w
    s套接字能向你的应用程序提供更快的数据访问速度,它仍然只是通过网络一次一个字节来共享数据。
    注意应用程序也可以通过剪贴板共享数据,但是剪贴板通常用于用户和应用程序交互。

抱歉!评论已关闭.