0

我正在做一个项目,其中我同时使用 VC++ 和 C#。VC++ 用于硬件接口(别无他法,我必须只使用 VC++)和我使用 C# 的应用程序端(micro soft Visual Studio 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。

现在我该怎么办?

4

2 回答 2

1

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

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

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

2)当底层流结束时(在这种情况下意味着当管道关闭时)

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

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

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

于 2009-11-07T18:01:15.403 回答
0

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

于 2009-11-07T18:00:32.567 回答