ACCESSC++和C#进程之中透过命名管道来通信(附源码)—上

C++和C#进程中通过命名管道通信(上)

 

“命名管道”是同样种简易的过程之中通信(IPC)机制。命名管道可于平等台微机的例外进程中,或以过一个网络的两样电脑的不比进程中,支持保险的、单为或双向的数额通信。用命名管道来规划应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的学识。因为命名管道用了微软网络提供者(MSNP)重定向器,通过一个网,在各国进程中树通信。这样一来,应用程序便不必关心网络协议的底细。

指令管道是圈Windows文件系统设计之同一种植机制,采用“命名管道文件系统”(NamedPipeFileSystem,NPFS)接口。因此,客户机和服务器应用可采用专业的Win32文件系统API函数(如ReadFile和WriteFile)来拓展数量的收发。通过这些API函数,应用程序便只是一直下Win32文件系统命名规范,以及WindowsNT/Windows2000文件系统的平安机制。NPFS依赖让MSNP重定向器在网上展开命名管道数据的殡葬和接。这样一来,便可实现接口的“与协商无关”特性:若以温馨开发的应用程序中应用命名管道在网上不同的经过中树通信,程序员不必关心基层网络传递协议(如TCP和IPX等等)的细节。

 

客户机和服务器

取名管道最酷的性状就是立一个简单的客户机/服务器程序设计系统。在此体系布局面临,在客户机与服务器之间,数据既是可是才为传递,亦可双向流动。对命名管道服务器和客户机来说,两者的区别在:服务器是唯一一个发出且创建命名管道的进程,也惟有她才会接受管道客户机的连天要。对一个客户机应用来说,它只能与一个备的命名管道服务器建立连接。在客户机应用与服务器应用中,一旦建好连接,两个过程都能够针对标准的Win32函数,在管道上展开多少的读取与写入。这些函数包括ReadFile和WriteFile等等。

 

服务器

苟想实现一个命名管道服务器,要求要支出一个应用程序,通过它创建命名管道的一个要多独“实例”,再由客户机进行走访。对服务器来说,管道实例实际就是是一个句柄,用于打地面或远程客户机应用接受一个老是要。按下述步骤行事,便可写起一个尽中心的服务器应用:

1)使用API函数CreateNamedPipe,创建一个命名管道实例句柄。

2)使用API函数ConnectNamedPipe,在命名管道实例上监听客户机连接要。

3)使用API函数ReadFile,从客户机接收数据;使用API函数WriteFile,将数据发给客户机。

4)使用API函数DisconnectNamedPipe,关闭命名管道连接。

5)使用API函数CloseHandle,关闭命名管道实例句柄。

率先,我们的服务器进程要采取CreateNamedPipe这个API调用,创建一个命名管道实例。

脚为有CreateNamedPipe()的函数原型:

 

HANDLE CreateNamedPipe(
 LPCTSTR
lpName,//指向管道名称的指针
 DWORD
dwOpenMode,//管道打开模式  DWORD
dwPipeMode,//管道模式  DWORD
nMaxInstances,//最酷实例数  DWORD
nOutBufferSize,//输出缓存大小
 DWORD
nInBufferSize,//输入缓存大小
 DWORD
nDefaultTimeOut,//超时设置  LPSECURITY_ATTRIBUTES
lpSecurityAttributes//安全属性指针
);

内部几单主要参数如下:

lpName是管道的名,命名管道的命名采用如下格式:

\\ServerName\Pipe\PipeName

其中,第一片\\ServerName指定了服务器的讳,命名管道服务就是当此服务器创建,而且一旦由它对进入的连日要进行“监听”,其配串有可代表为一个粗数点”.”(表示本机)、星号(当前网字段)、域名或是一个当真的服务;第二局部\Pipe是一个不行变更之硬编码字串,以指出该文件是自属于NPFS,不区分轻重缓急写;第三有\PipeName则是应用程序可以唯一定义及标识一个命名管道的名字,而且可以设置多级目录。

dwOpenMode参数用于指示一个管道创建好下,它的传导方向、I/O控制与安全模式。PIPE_ACCESS_表明决定了在客户机与服务器之间,数据以管道上之流淌方向。可用PIPE
_ACCESS_DUPLEX标志为双向传输方式打开一个管道。也就是说,在客户机与服务器之间,数据可双向传输。除本条之外,亦可使PIPE_ACCESS_INBOUND或者PIPE_ACCESS_OUTBOUND标志,以仅为传输方式打开一个管道。也就是说,数据只能由客户机传向服务器,或打服务器传向客户机。

dwPipeMod命名管道提供了点滴栽为主的通信模式:字节模式(PIPE_TYPE_BYTE)和信息模式(PIPE_TYPE_MESSAGE)。在字节模式中,信息为连续字节流的款型以客户及服务器之间流动,这吗即代表,对于客户机应用以及服务器应用,在其他一个一定的年月段外,都爱莫能助准确掌握出些许字节从管道遭读来或写入。在这种通信模式面临,一在以向阳管道写副某个数的配节后,并无可知确保管道外一样正在会念来当量的字节。对于信息模式,客户机和服务器则是经一致名目繁多不总是的数据包进行数量的收发。从管道起的诸一样久信息都得作一如既往长长的完整的信读入。

任何的函数及其参数含义详见msdn,此处不一一讲解。

服务器调用该函数,如果以已定义超时值变为零以前,有一个实例管道可以应用,则开创成功并赶回管道句柄,以此侦听来自客户机的接连要。

 

客户机

落实一个命名管道客户机时,要求支付一个应用程序,令其树立与有命名管道服务器的接连。注意客户机不可创建命名管道实例。然而,客户机可打开来自服务器的、现成的实例。下述步骤讲解了什么编写一个骨干的客户机应用:

1)用API函数WaitNamedPipe,等候一个命名管道实例可供应自己以。

2)用API函数CreateFile,建立和命名管道的连日。

3)用API函数WriteFile和ReadFile,分别向服务器发送数据,或从中接收数据。

4)用API函数CloseHandle,关闭打开的命名管道会话。

立一个连之前,客户机需要用WaitNamedPipe函数,检查是否在一个现成的命名管道实例。WaitNamedPipe成功就后,客户机需要为此CreateFile这个API函数,打开指向服务器命名管道实例的一个句柄。

简单说来,服务器调用CreateNamedPipe来创造管道,如果当就定义超时值变为零以前,有一个实例管道可以采用,则开创成功并赶回管道句柄,以此侦听来自客户机的连续要。另一方面,客户机通过函数WaitNamedPipe()使服务器进程等来自客户之实例连接。如果当超时值变为零以前,有一个管道可供应连接使用,则函数将打响返回,并透过调用CreateFile()或CallNamedPipe()来呼叫对服务器的连天。此时服务器将收受客户之连年要,成功建立连接,服务器调用的等候客户机建立连接的ConnectNamedPipe()函数也用成返回。然后,管道两端就得拓展通信了。

从调用时先后上看,首先是客户机通过WaitNamedPipe()使服务器的CreateFile()在限时时光外创造实例成功,然后双方经过ConnectNamedPipe()和CreateFile()成功连接,在回用以通信的公文句柄后,客户、服务两岸即可开展通信。

当确立了连年后,客户机与服务器即可通过ReadFile()和WriteFile()并采用取得的管道句柄,以文件读写的花样彼此间开展信息置换。当客户及服务器的通信结束,或是由于某种原因一着要断开时,由客户机调用CloseFile()函数关闭打开的管道句柄,服务器就调用DisconnectNamedPipe()函数。当然,服务器也堪经单方面调用DisconnectNamedPipe()来已连接。在停连接后调用函数CloseHandle()来关闭这个管道。

下篇将受来之程序清单即是依上述措施实现的命名管道服务器和客户机进行通信的程序实现代码:

相关文章