C++和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
n马克斯(Max)Instances,//最大实例数  DWORD
nOutBufferSize,//输出缓存大小
 DWORD
nInBufferSize,//输入缓存大小
 DWORD
nDefault提姆eOut,//超时设置  LPSECURITY_ATTRIBUTES
lpSecurityAttributes//安全属性指针
);

个中多少个首要参数如下:

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

\\ServerName\Pipe\PipeName

ACCESS,里头,第一部分\\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()来关闭此管道。

下卷将交由的程序清单即是依据上述模式实现的命名管道服务器和客户机举行通信的程序实现代码:

相关文章