命名管道操作

【勇芳软件工作室】汉化HomePreviousNext

服务器首次调用CreateNamedPipe时,该函数指定可同时存在的管道的最大实例数。受此限制,服务器可以重复调用CreateNamedPipe创建管道的其他实例。如果函数成功,则每个调用返回一个到命名管道实例的服务器端的句柄。

创建管道实例后,客户端进程可以通过调用CreateFileCallNamedPipe函数连接到该实例。如果管道实例可用,CreateFile返回一个句柄到管道实例的客户端。如果没有管道实例可用,客户端进程可以使用WaitNamedPipe函数等待一个可用。

客户端进程还可以使用CallNamedPipe将连接到管道实例的功能(等待一个可用,如有必要),写入消息,读取消息和关闭管道句柄组合成单个操作。CallNamedPipe只能由客户端进程使用,只能使用消息类型的管道。

服务器进程在调用ConnectNamedPipe函数时指定管道实例的句柄,以确定客户端进程何时连接到该实例。如果管道手柄处于阻塞模式,则ConnectNamedPipe操作在客户端连接之前不会返回。

除了CallNamedPipe __以外,客户端和服务器进程可以调用__的几个函数之一来读取和写入命名管道。这些功能的行为取决于管道类型和指定管道句柄的有效模式,如下所示:

* ReadFileWriteFile功能可用于字节类型或消息类型管道。

*如果为重叠操作打开了管道句柄,则ReadFileExWriteFileEx函数可以与字节类型或消息类型的管道一起使用。

* PeekNamedPipe功能可用于读取,而不会删除字节型管道或消息类型管道的内容。PeekNamedPipe还可以返回有关管道实例的其他信息。

*如果调用进程的管道句柄设置为消息读取模式,则TransactNamedPipe功能可用于消息类型管道。该函数写入请求消息,并在单个操作中读取回复消息,从而提高网络性能。

对于字节读取模式下的管道句柄,当读取管道中的所有可用字节或读取指定的字节数时,读取操作将成功完成。

对于消息读取模式下的管道句柄,只有在读取整个消息时,ReadFileReadFileEx操作才能成功完成。如果要读取的指定字节数小于下一个消息的大小,则在返回FALSE(GetLastError函数返回ERROR_MORE_DATA)之前,该函数尽可能读取消息。但是,通过对ReadFile ReadFileExPeekNamedPipe进行其他电话,可以读取其余的消息。请注意,PeekNamedPipe在读取完整或部分消息后返回TRUE,并报告部分读取的消息中剩余的字节数。

对于具有多个未读消息的消息类型管道,使用消息读取管道句柄的读取操作在读取一条消息后返回。使用字节读取句柄的操作不区分消息__它读取所有可用字节直到指定的数字。

当客户端和服务器完成使用管道实例时,服务器调用DisconnectNamedPipe函数来关闭与客户端进程的连接。此函数使客户端的句柄无效(如果尚未关闭)。管道中的任何未读数据都将被丢弃。为了确保写入管道的所有字节或消息都被客户端读取,服务器首先调用FlushFileBuffers函数,直到客户端从管道中读取所有数据为止。客户端断开连接后,服务器调用CloseHandle函数关闭其管道实例的句柄。或者,服务器可以使用ConnectNamedPipe来启用新的客户端连接到管道的这个实例。

进程可以通过调用GetNamedPipeInfo函数来检索有关命名管道的信息,该函数返回管道的类型,输入和输出缓冲区的大小以及可以创建的最大管道实例数。GetNamedPipeHandleState功能报告管道句柄的读取和等待模式,当前管道实例数以及通过网络通信的管道的其他相关信息。SetNamedPipeHandleState功能设置管道手柄的读取模式和等待模式。对于与远程服务器通信的客户端进程,该函数还控制收集的最大字节数或发送消息之前等待的最长时间(假设客户端的句柄未启用直写模式而打开)。