VC ++ 6.0和C#visual studio 2008之间的命名管道

时间:2009-11-07 17:48:10

标签: c# named-pipes

我正在做一个我正在使用VC ++和C#的项目。 VC ++用于硬件接口(没有别的,我必须只使用VC ++)和应用程序端我正在使用C#(微软视觉工作室2008)。

对于两个相互通信的程序,我使用命名管道(这也是必须的)。

我能够在C#和VC ++之间进行通信,但不能将VC ++与C#进行通信。

我已经在下面给出了我在C#中使用的代码。

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe"))
{
pipeStream.WaitForConnection();
Console.WriteLine("[Server] Pipe connection established");

using (StreamReader sr = new StreamReader(pipeStream))
 {
   while ((temp = sr.ReadLine()) != null)                    
   {
      MessageBox.Show(temp));    
   }
 }
}

这里的问题是sr.ReadLine()。根本没有终止。它应该在找到null后停止,但VC ++给出的null值在C#中不被视为NULL。

现在该怎么办?

2 个答案:

答案 0 :(得分:1)

C ++中的NULL常量实际上只是零。一个普通的零“int”类型,没什么特别的。因此,当您向管道写入NULL时,您只是传输零,这就是全部。并且C#端尽职尽责地读取零作为它正在阅读的字符串的一部分。

ReadLine()在两种情况下终止:

1)遇到“新行”序列(即0x0D 0x0A)后。

2)当基础流结束时(在这种情况下意味着管道已经关闭)

在第二种情况下,它返回在流关闭之前有机会读取的任何内容,并且对ReadLine()的任何后续调用都将返回null。

因此,为了使ReadLine()返回null,您必须从VC ++端关闭管道。

但是,我想这不是你想要做的。因此,我的建议是首先开发并仔细指定您将用于通信的协议,然后才能实际编码接收和发送方。

答案 1 :(得分:0)

ReadLine只会在到达文件末尾时返回NULL。发送数据后,您是否在客户端关闭管道?