【发布时间】:2010-08-22 02:51:24
【问题描述】:
虽然我已经浏览了文档here,但它对我来说仍然没有意义:
数据作为流从管道中读取 的消息。这种模式只能 如果 PIPE_TYPE_MESSAGE 也是 指定。
【问题讨论】:
标签: c++ named-pipes
虽然我已经浏览了文档here,但它对我来说仍然没有意义:
数据作为流从管道中读取 的消息。这种模式只能 如果 PIPE_TYPE_MESSAGE 也是 指定。
【问题讨论】:
标签: c++ named-pipes
在 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
【讨论】:
PIPE_TYPE_BYTE和PIPE_TYPE_MESSAGE类型模式的区别在http://msdn.microsoft.com/en-us/library/aa365605.aspx上有说明:
类型模式
管道的类型模式决定了如何 数据被写入命名管道。数据 可以通过一个命名的 管道作为字节流或作为 消息流。管道服务器 调用时指定管道类型 CreateNamedPipe 创建实例 的命名管道。类型模式必须 对于 a 的所有实例都相同 管道。
要创建字节类型管道,请指定 PIPE_TYPE_BYTE 或使用默认值 价值。数据写入管道 作为字节流,系统 不区分 以不同方式写入的字节 操作。
要创建消息类型管道,请指定 PIPE_TYPE_MESSAGE。系统对待 每次写入的字节数 作为消息对管道进行操作 单元。系统总是执行写 对消息类型管道的操作就像 已启用直写模式。
如果你想写一个关于管道的数据流,你应该使用PIPE_TYPE_BYTE 类型模式。然后,您可以在管道缓冲区中写入与WriteFile 相关的任何数据,并在另一侧读取ReadFile 的数据。如何准确地发送数据对您来说并不重要。来自WriteFile 操作的数据可以作为一个数据块传输。
如果您使用PIPE_TYPE_MESSAGE 类型模式,则每个写入操作都会跟随数据传输,因为管道中的写入将被解释为消息的发送。有一个特殊的功能TransactNamedPipe 允许您将消息写入指定的命名管道并从指定的命名管道读取消息到单个网络操作。
【讨论】: