第4章命名管道
“命名管道”或“命名管线”(Named Pipes )是一种简单的进程间通信( I P C)机制, 命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的
不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。
要记住的一个重点是,将命名管道作为一种网络编程方案使用时,它实际上建立一个简单的客户机/服务器数据通信体系,可在其中可靠地传输数据。
4.1.1 命名管道命名规范命名管道的标识是采用U N C格式进行的:
\ \ s e r v e r \ P i p e \ [ p a t h ] n a m e
上述字串可分为三部分来观看: \ \ s e r v e r、\ P i p e和\ [ p a t h ] n a m e。第一部分\ \ s e r v e r指定一个服务器的名字。命名管道便是在那个服务器上创建的,而且要由它对进入的连接请求进行“监听”。第二部分\ P i p e是一个不可变化的“硬编码”字串(必须原样照录,但不用区分大小写),用于指出该文件从属于N P F S。而第三部分\ [ p a t h ] n a m e则使应用程序可以“唯一”定义
及标定一个命名管道的名字,而且可在这里设置多级目录。
4.1.2 字节模式及消息模式
命名管道提供了两种基本通信模式:字节模式和消息模式。
命名管道服务器应用只能在Windows NT或Windows 2000上工作——Windows 95和Windows 98 不允许应用程序创建命名管道!
4.2.2 高级服务器的细节
在前面的程序清单4 - 1中,我们展示了如何设计一个命名管道服务器应用,令其只负责对一个管道实例的控制。所有A P I调用都采用同步模式工作。在这种模式下,每个调用都会一直等到I / O请求完成,才会返回。命名管道服务器也能拥有多个管道实例,所以客户机能够建立
同服务器的两个或更多的连接;管道实例的数量要受到C r e a t e N a m e d P i p e这个A P I调用之n M a x I n s t a n c e s参数指定的数字的限制。要想同时控制不止一个的管道实例,服务器必须考虑使用多个线程,或者使用异步Win32 I/O机制(比如重叠式I / O以及完成端口等),分别为每个管道实例提供服务。
采用异步I / O机制,服务器可从单独一个应用程序线程中,同时为所有管
道实例提供服务。在此,我们将解释如何使用线程以及重叠式I / O,来开发更高级的服务器应用。
1 . 线程
要想开发一个高级服务器,令其使用线程,同时支持多个管道实例,整个过程是非常简单的。我们要做的唯一事情便是为每个管道实例都创建一个线程.
2. 重叠式I / O
重叠式I / O是一种特殊的输入/输出机制,允许Win32 API函数(如R e a d F i l e和Wr i t e F i l e)在发出I / O请求之后,以异步方式工作。具体的工作原理是:向这些A P I函数传递一个O V E R L A P P E D
(重叠式)结构,然后使用A P I函数G e t O v e r l a p p e d R e s u l t,从原来那个O V E R L A P P E D结构中,取得一次I / O请求的结果。如果在使用重叠式结构的前提下,调用一个Win32 API函数,那么调用无论如何都会立即返回!
3. 安全模拟
之所以会选择命名管道作为自己的网络编程方案,一个最好的理由便是它们依赖于Windows NT及Windows 2000的安全机制,Windows NT和Windows 2000安全机制具有“模拟”能力,允许一个命名管道服务器
应用在客户机的安全环境中执行。执行一个命名管道服务器应用时,它通常会在用于启动该应用的那个进程的安全环境许可级别上工作。例如,假如拥有管理员权限的某人启动了一个命名管道服务器,服务器便有权访问Windows NT或Windows 2000系统上的几乎任何资源。此时,假如在C r e a t e N a m e d P i p e中指定的S E C U R I T Y _ D E S C R I P TO R结构允许所有用户访问这个
命名管道,就会埋下极大的安全隐患。
4.5 小结
本章向大家介绍了命名管道网络编程技术,它为我们建立了一个简单的客户机/服务器数据通信体系,可确保数据进行可靠传输。接口依赖于Wi n d o w s重定向器,以便通过一个网络来传送数据。对命令管道而言,它最大的一项好处便是直接利用了Windows NT及Wi n d o w s2 0 0 0的安全机制,该机制是本书讲到的其他网络技术均不具备的一项好处!下面第二部分将向大家深入讲解Wi n s o c k技术,以便应用程序利用一种网络传输协议,进行“直接”通信。