【问题标题】:Named pipe details命名管道详细信息
【发布时间】:2015-12-05 11:31:57
【问题描述】:

我需要将消息从 C#.Net 应用程序发送到 Windows 上的 C++ 应用程序。它们将在同一台 PC 上运行。在做了一些研究之后,听起来使用命名管道可能会起作用。但我仍然对几个细节感到困惑。因此,如果有人能填补我的空缺,我将不胜感激。

  1. 听起来命名管道基本上是一种文件。如果我的 .Net 应用程序不断写入文件,它会继续变大吗?或者我写的东西会在 C++ 应用程序读取后立即消失吗?

  2. 如果我通过一次 write() 调用发送消息,我能保证它会被一起读取,还是可以分解?例如,如果我发送“hello”,是否有可能是我先读“hel”然后读“lo”?

  3. 如果我在尝试阅读之前发送多条消息,它们只是坐在那里,我可以一次阅读几条,我是否正确?是否需要多次 read() 调用才能获取每条消息,还是将它们全部连接在一起?

  4. C++ 应用程序有什么方法可以知道消息正在等待?或者我应该只是有一个循环尝试阅读一条消息,休眠,然后尝试再次阅读?

【问题讨论】:

    标签: c# c++ pipe named-pipes


    【解决方案1】:

    听起来命名管道基本上是一种文件。如果我的 .Net 应用程序不断写入文件,它会继续变大吗?或者我正在写的东西会在 C++ 应用程序读取后立即消失吗?

    管道并没有真正的尺寸。其中可能有一些字节数,您可以将其称为管道的大小。这将是化妆品。你为什么在乎?如果您担心管道可能在您的平台上实现得非常糟糕,那么您应该切换平台。

    如果我使用单个 write() 调用发送消息,我是否保证它会被一起读取,或者它可以被分解?例如,如果我发送“hello”,是否有可能是我先读“hel”然后读“lo”的时间?

    管道是字节流。管道上没有消息这样的东西。 (至少,据管道所知。)

    如果我在尝试阅读之前发送多条消息,它们只是坐在那里,我可以一次阅读几条,我是否正确?是否需要多次 read() 调用才能获取每条消息,还是将它们全部连接在一起?

    没有消息。管道是字节流。如果您尝试读取 100 个字节,您将获得 100 个字节,除非可用的字节数少于该数字。

    C++ 应用程序有什么方法可以知道有消息在等待吗?或者我应该只是有一个循环尝试阅读一条消息,休眠,然后尝试再次阅读?

    您可以在读取管道时设置线程块。该线程的存在只是为了允许您以一种简单的方式查询消息是否正在等待,例如,将从管道读取的字节馈送到某种线程安全队列中。它可以包含应用级消息协议逻辑,因此队列将包含完整的应用级消息。

    就读写语义而言,管道的行为与 TCP 连接非常相似。

    【讨论】:

    • 您需要调整以覆盖 C# 程序中的消息类型管道 PipeTransmissionMode.Message。并在 C++ 端重叠 I/O。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-03-19
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2022-10-01
    • 2019-09-30
    相关资源
    最近更新 更多