你能更详细地解释PIPE_READMODE_MESSAGE / PIPE_READMODE_BYTE之间的区别吗?

时间:2010-08-22 02:51:25

标签: c++ named-pipes

虽然我已经阅读了here文件,但它对我来说仍然没有意义:

  

数据作为流从管道中读取   消息。此模式只能是   如果PIPE_TYPE_MESSAGE也是   指定。

2 个答案:

答案 0 :(得分:5)

在BYTE模式下,您需要确定数据的分离,以便在接收端对其进行解码。在MESSAGE模式下,API将为您执行此操作。当您阅读另一侧的消息时,您将拥有整个数据块(消息)。

在这两种情况下,如果要混合通过管道发送的数据类型,您仍然需要一些标题数据来包装您的消息/数据以了解它是什么。

编辑:文档指出了一个非常明确的使用此API的客户端/服务器示例以及两者之间的MESSAGE模式。

http://msdn.microsoft.com/en-us/library/aa365592%28v=VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/aa365588%28v=VS.85%29.aspx

答案 1 :(得分:1)

http://msdn.microsoft.com/en-us/library/aa365605.aspx上解释了PIPE_TYPE_BYTEPIPE_TYPE_MESSAGE类型模式之间的差异:

  

类型模式

     

管道的类型模式决定了如何   数据被写入命名管道。数据   可以通过命名传输   管道作为字节流或作为   消息流。管道服务器   调用时指定管道类型   CreateNamedPipe用于创建实例   一个命名管道。类型模式必须   对于a的所有实例都是相同的   管。

     

要创建字节类型的管道,请指定   PIPE_TYPE_BYTE或使用默认值   值。数据将写入管道   作为字节流和系统   没有区分   用不同的写入写的字节   操作

     

要创建消息类型管道,请指定   PIPE_TYPE_MESSAGE。系统对待   每次写入时写入的字节数   作为消息操作管道   单元。系统始终执行写入   对消息类型管道的操作就好像   已启用直写模式。

如果要编写与管道相关的数据流,则应使用PIPE_TYPE_BYTE类型模式。然后,您可以在WriteFile中写入管道缓冲区中的任何数据,并在另一侧读取ReadFile。数据的确切发送方式对您来说并不重要。某些WriteFile操作的数据可以作为一个数据块传输。

如果使用PIPE_TYPE_MESSAGE类型模式,则每次写入操作都会跟随数据传输,因为管道中的写入将被解释为发送消息。有一个特殊函数TransactNamedPipe,它允许您向指定的命名管道写入消息并将消息读入单一网络操作