命名管道和邮件槽

1.命名管道和邮件槽

并且广泛使用于Windows 2000系统的API函数。命名管道(namedpipe)和邮件槽(mailslot)是微软起初为OS/2局域网管理器开发的编程API,随后移植到 WindowsNT。命名管道提供可靠的双向通信,然而邮件槽只提供不可靠的单向通信。邮件槽的一个优点在于它具有广播能力。在Windows 2000中,以上两种API都利用了Windows 2000的安全特性,这样就能让服务器精确地控制哪些客户可以连接它。

名称服务器依照Windows 2000通用命名规范(UNC)为命名管道和客户指定名称Windows网络中用于定位资源的,有独立于协议的方法。

(1)命名管道的操作

命名管道通信由命名管道服务器和命名管道客户组成。命名管道服务器是创建命名管道、让 用户连入的应用程序。命名管道的名字格式为\\Server\Pipe\PipeName。其中Server指定了执行命名管道服务器的计算机名(命名管 道服务器无法在远程系统上创建命名管道),此计算机名可以是DNS名称(例如mspress.microsoft.com),NetBIOS名称 (mspress),或者是IP地址(255.0.0.0)。
格式中的Pipe就是字符串“Pipe”,而PipeName是给命名管道指定的唯一名称。此唯一名称可以包含子目录,例如,\LMyComputerXPipeXMyServerApp\ConnectionPipe。

命名管道服务器使用CreateNamedPipeWin32函数来创建命名管道。函 数的输人参数之一是命名管道名字的指针,形式为\\.\Pipe\PipeName。“\\.\”是Win32为本地计算机定义的别名。其他参数则包括一 个可选的安全描述符用于保护对命名管道的访问,一个用于指定管道以单向或双向方式工作的标志,一个最大的并发连接数的值,以及一个用于指定管道以字节方式 还是消息方式去工作的标志。

大多数网络API只以字节方式工作,也就是说,发送方发送的一条消息在接收方可能需要 多次接收,然后从碎片中重建完整的消息。以消息方式工作的命名管道简化了接收方的实现,因为一次发送意味着一次接收,它们是——对应的。因此每次接收完成 后,接收方总能得到—条完整的消息,它无需记录前前后后的消息碎片。

以一个特定的名字初次调用CreateNamedPipe创建了这个名字的第一个实 例,同时建立了所有与之相关的命名管道实例的行为。如果再次调用CreateNamedPipe,则服务器再创建一个实例,但不能超过第一次调用所指定的 最大连接数量。在创建了至少一个命名管道的实例之后,服务器执行ConnectNamedPipeWin32函数,用来让已有命名管道和客户建立连接。 CreateNamedPipe既可以同步执行,也可以异步执行,此调用直到客户与实例建立了连接(或错误产生)才算完成。命名管道客户使用 Win32CreateFile和CallNamedPipe函数连接服务,指定服务器创建的管道名称。如果服务器已执行了 ConnectNamedPipe调用,则客户的安全配置文件以及它所请求的对管道的访问权限(读、写)都通过命名管道安全描述符进行验证。如果客户被授 予访问命名管道的权限,它就会收到一个代表命名管道连接的客户端句柄,此时服务完成对ConnectNamedPipe的调用。

在建立命名管道的连接之后,客户和服务器可以使用ReadFile和WriteFileWin32函数从管道中读取和写入管道。命名管道支持同步和异步的传输操作。图7-4表示了服务器与客户之间通过命名管道的通信。

(2)邮件槽的操作

邮件槽提供一种不可靠的、单向广播机制。例如,使用这种通信方式的应用程序可以是时间同步服务,它可以每几秒就向域内广播源端时间。然而,对于网络中的每台计算机并不都需要接收源端时间的消息,因此,使用邮件槽是客户端网络应用的补充。

邮件槽像命名管道一样,与Win32 API集成在一起。邮件槽服务器用CreateMailslot函数创建—个邮件槽。CreateMailslot名称的输人格式为“\\.\Mailslot\MailslotName”。其中,邮件槽服务
器只能在执行它的机器上创建邮件槽,它的名称能包含子目录,这一点与命名管道相似。CreateMailslot也可以接收安全描述符用于控制客户对邮件 槽的访问。CreateMailslot返回的句柄会被重叠,即用此函数返回的句柄进行的操作是异步执行的,比如发送和接收消息。

(3)命名管道和邮件槽的实现

正是由于命名管道和邮件槽与Win32紧密地结合在一起,因此它们都实现在 Kernel32.dll的Win32客户端DLL中。应用程序使用ReadFile和WriteFile函数来发送和接收命名管道和邮件槽的消息,这些 函数是基本的Win32I/O例程。用于创建CreateFile函数也是标准的Win32 I/O例程。然而, 由命名管道和邮件槽指定的名称确定了由命名管道文件系统驱动程序(\Winnt\System32\Npfs.sys)和邮件槽文件系统驱动程序 (\Winnt\System32\Drivers\Msfs.sys)所管理的系统名字空间。命名管道文件系统驱动程序创建了一个名 为\Device\NamedPipe的设备对象和一个相应的符号连接\??\Pipe,邮件槽文件系统驱动程序创建了名 为\Device\Mailslot的设备对象和它的符号连接\??\Mailslot。以\\.\Pipe\…和\\.\Mailslot\...为格 式的名称,这些名称通常传给CreateFile,它们都带有前缀\\.\。这些前缀会被译成\??\,这样,名称可以通过设备对象的符号连接进行析。 CreateNamedPipeCreateMailslot是两个比较特别的函数,它们使用相应的本地函数NtCreateNamedPipeFile 和NtCreateMailslotFile。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值