Windows各种通信方式

来源:互联网 发布:hive sql数据列合并 编辑:程序博客网 时间:2024/05/22 04:51
一、邮槽 MailSlots
1.在本地机上建立邮槽,远程上是不可以的.
2.WindowsCE不支持它.   
3.可广播
4.单向本地进程间通信,只允许从客户端发送到服务器,没有可靠性保证,根据广播通信体系所设计,使用邮槽可以建立不可靠的单向数据传输。其优点就是可以很方便的向一个或者多个服务器广播消息。
5.为保证邮槽在各种Windows平台下都能够正常工作,我们传输消息的时候,应将消息的长度限制在424字节以下。
6.Mailslot的最大缺陷是不可靠,因为它的数据是以数据报格式来传送的,网络错误或负荷过重都会导致数据丢失
7.但mailslot有一个很大的优点:它支持数据广播
8.缺点:依赖于端口445或者139

二、匿名管道 Anonymous Pipe
现在大多数都是基于管道通信的,因为每两个进程都可以共享一个管道来进行单独的对话,就象打电话单独占用一条线路一样,而不必担心像剪贴板一样会有串音,匿名管道是一种只能在本地机器上实现两个进程间通信的管道,它只能用来实现一个父进程和一个子进程之间实现数据传输.其实它是非常有用的,我做过一个实际的项目就是利用匿名管道,项目就是让我写一个Ping程序来监测网络的通信状况,并且要把统计结果和执行过程显示在我们的软件里, windows有一个自带的ping程序,而且有执行过程和统计,所以我没必要再发明一个(重复发明就等于犯罪----程序员要牢记阿), 只是windows的那个Ping程序的执行结果都显示在了CMD的界面上了,我需要把它提取出来显示在我们的软件界面上,于是我就利用了匿名管道实现了这个程序,当我们的软件要启动Ping任务时,我就先CreatePipe创建匿名管道,再CreateProcess启动了windows下面的Ping程序(它作为我们软件的子进程),当然要把管道的读写句柄一起传给子进程,这样我就可以轻松的把Ping的执行结果了写入到我的Buffer里了,是不是很 easy。

三、命名管道 Named Pipe
命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信,就像我现在正使用MSN跟我远方的同学聊天一样!其实如果你用过 Socket编写网络程序的话,你就会明白所谓的命名管道之间的通信就相当于把计算机低层网络网络通信部分给封装了起来,使用户使用起来不必了解那么多网络通信的知识,总之一句话就是用起来简单,其实我们在为别人提供函数库的时候都应该遵循这个规律,把低层烦琐,复杂,抽象的都封装起来,对高层提供统一的接口.
    在Windows2000/NT以后,都可以在创建管道时指定据有访问权限的用户使用管道,进一步保证了安全性,而如果你要是自己使用Socket实现这个功能的话就太麻烦了,当然很多程序员已然会自己实现它,他们的理由很可能是因为windows都不安全.命名管道实现进程间的通信也跟网络通信一样是 C/S结构的,服务器进程负责创建命名管道及接受客户机的连接请求,就象socket中Server部分要实现bind、linstening和 accept一样, 而客户端只负责连接,对应于socket中的connect一样.
    命名管道提供了两种基本通信模式:字节模式和消息模式,在字节模式下,数据以一个连续的字节流的形式在server于client之间流动,而消息模式下,客户机和服务器则通过一系列不连续的数据单位进行数据收发,每次管道上发出了一条消息后,它必须作为一条完整的消息读入,是不是很像TCP和UDP.

四、剪贴板 Clipped Board

五、自定义消息 WM_USER

六、系统消息 WM_COPYDATA
WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。 

七、套接字 Sockets

八、映射内存文件 File Map
有二种
1.映射内存文件
2.共享数据

九、动态数据交换 DDE
  动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
  DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式:
  (1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
  (2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
  (3) 热链:当数据交换时服务器自动给客户发送数据。
  DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE 
      
  每个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最早的基于Windows的数据交换方法,有三种方式可供选择:冷连接、温连接和热连接。一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。在连接建立后,数据可以双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。       
      
  DDE还有网络功能。使用过Win311   For   Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE   只能局限在同一台机器上。与其它的数据交换方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。

十、文件共享      
  在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311   For   Workgroup或Windows   95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现数据交换。但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。  

十一、NetBIOS      
  从80年代开始,NetBIOS就是开发Client/Server类程序的标准接口。而当时其它的解决方案几乎都是从UNIX系统上发展而来的。当然,对于今天的用户而言,NetBIOS已不是唯一的选择,他们可以从各种方案中择优选取。在Windows   95和NT平台上,可以通过API函数Netbios()来调用NetBIOS功能。       
      NetBIOS兼容以下几种低层协议:NetBEUI协议(NBF)、NWLink   NetBIOS(NWNBlink)、NetBIOS   over   TCP/IP(NetBT)。NetBIOS的优点是速度较快,缺点是可靠性较差.

十二、COM和DCOM      
  公共对象模式(COM)是一种协议,它建立了一个软件模块同另一个软件模块之间的连接,然后将其描述出来。当这种连接建立起来之后,则两个模块之间就可以通过称为“接口”的机制来进行通讯。COM可以用不同的语言(VB、VC、Delphi)进行编制,又能被其它语言编写的程序所使用,并且不用管通讯双方实际所处的位置(是在同一台机上,还是在同一个网络上的不同机上)。事实上,Internet上有大量的COM控件可供人们下载使用,其中有相当一部分就是用于应用程序间的相互通讯(甚至是Internet程序间的通讯),硬盘上能够看到的大量的.ocx文件其实就是一种COM。       
       COM对象为外部调用提供了一个标准的界面,COM   Client通过创建COM   Server的一个实例获得指针,转向所需的函数定义处并执行相应的程序。讲得通俗一点,也就是先正确定义好COM对象的属性(Property),再执行相应的方法(Method)。       
       DCOM(分布式公共对象模式)是COM在网络上的一种扩展,它通过把分布式对象间的通讯变成一个实体来实现通讯。       
       COM如今被微软公司大力提倡,最著名的有OLE、ActiveX、DirectX和Win95、WinNT的外壳。由于微软公司目前在软件业处于霸主地位,所以COM很有可能成为将来的业界标准,其前途也较为看好。但COM的庞大也会使一些经验丰富的程序员望而却步,他们宁可自己多写一些代码以使整个程序更为简洁、有效而不愿使用COM。       
      
  以上介绍的只是现今流行的一些通讯方法,它们各有各的优缺点,没有哪一种是万能的。因此,只有在合适的场合采用合适的方案,才是最好的解决办法。