上一篇介绍了匿名管道,现在介绍一下命名管道(Named Pipes)。本篇较长,建议读者朋友收藏后慢慢阅读。命名管道是需要在创建时为其命名的管道。命名管道可以是单向(One-way)的,也可以是双向(Two-way, or Duplex)的。命名管道可以有多个实例(instance),它们共享一个名称,但每个实例都有各自的缓冲区和句柄,可以同时与多个客户端通信。
命名管道可供同一台主机上的不同进程间相互通信,也可供网络中不同主机上的进程相互通信,服务端的主机要确保server服务处于运行状态。如果不希望创建的命名管道被网络上的其他主机访问,可以设置管道的安全属性,使其拒绝被NT AUTHORITY\NETWORK账户访问。
创建命名管道实例的进程叫服务端,连接到命名管道实例的进程叫客户端。只要能通过安全检查,任何进程都可以访问命名管道。
服务端用CreateNamedPipe()函数创建命名管道的实例,再用ConnectNamedPipe()函数接受客户端的连接。客户端用CreateFile()函数或CallNamedPipe()函数连接到命名管道。
下面从命名管道的设计、操作等方面对命名管道进行简要介绍。
一、命名管道的设计
命名管道功能强大,创建时需从多方面定义,都体现在CreateNamedPipe()函数的输入参数中。
CreateNamedPipe()原型如下:
HANDLE CreateNamedPipe(
[in] DWORD lpName,
[in] DWORD dwOpenMode,
[in] DWORD dwPipeMode,
[in] DWORD nMaxInstances,
[in] DWORD nOutBufferSize,
[in] DWORD nInBufferSize,
[in] DWORD nDefaultTimeOut,
[in,optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
在使用命名管道前要有一个总体规划,可提前填写以下工作表:
名称 |
||
缓冲区大小 |
||
打开模式 (OpenMode) |
AccessMode |
PIPE_ACCESS_INBOUND PIPE_ACCESS_OUTBOUND PIPE_ACCESS_DUPLEX |
OverlappedMode |
YES NO |
|
Wri |