命名管道细节

时间:2015-12-05 11:31:58

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

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

  1. 听起来像命名管道基本上是一种文件。如果我的.Net应用程序继续写入文件,它会不断变大?或者,一旦C ++应用程序读完它,我写的任何内容都会消失吗?

  2. 如果我发送一条带有一个write()调用的消息,我保证会一起阅读,还是会被分解?例如,如果我发送"你好",那么我的时间是否可以读到" hel"然后" lo"?

  3. 我是否正确如果我在尝试阅读之前发送了几封邮件,他们只是坐在那里我可以一次阅读几封?是否需要多次read()调用来获取每条消息,或者它们是否会连接在一起?

  4. C ++应用程序有没有办法知道邮件正在等待?或者,我是否应该尝试读取消息,休眠,然后尝试再次阅读?

1 个答案:

答案 0 :(得分:1)

  

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

管道的尺寸确实不大。其中可能有一些字节数,您可以将其称为管道的大小。这将是化妆品。你为什么在乎?如果您担心管道可能会在您的平台上严重执行,那么您应该切换平台。

  

如果我发送一条带有一个write()调用的消息,我保证它会被一起读取,还是会被分解?例如,如果我发送"你好",那么我的时间是否可以读到" hel"然后" lo"?

管道是字节流。管道上没有消息这样的东西。 (至少,就管道而言。)

  

我是否正确如果我在尝试阅读之前发送了几条消息,他们只是坐在那里我可以一次阅读几条消息?是否需要多次read()调用来获取每条消息,或者它们是否会连接在一起?

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

  

C ++应用程序有没有办法知道消息正在等待?或者,我是否应该尝试读取消息,休眠,然后尝试再次阅读?

读取管道时可以有一个线程块。该线程可以存在只是为了允许您查询消息是否在等待的简单方法,例如,通过将从管道读取的字节提供给某种类型的线程安全队列。它可以包括应用程序级消息协议逻辑,因此队列将包含完整的应用程序级消息。

就读写语义而言,管道几乎就像TCP连接一样。