我正在做一个我正在使用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。
现在该怎么办?
答案 0 :(得分:1)
C ++中的NULL常量实际上只是零。一个普通的零“int”类型,没什么特别的。因此,当您向管道写入NULL时,您只是传输零,这就是全部。并且C#端尽职尽责地读取零作为它正在阅读的字符串的一部分。
ReadLine()在两种情况下终止:
1)遇到“新行”序列(即0x0D 0x0A)后。
2)当基础流结束时(在这种情况下意味着管道已经关闭)
在第二种情况下,它返回在流关闭之前有机会读取的任何内容,并且对ReadLine()的任何后续调用都将返回null。
因此,为了使ReadLine()返回null,您必须从VC ++端关闭管道。
但是,我想这不是你想要做的。因此,我的建议是首先开发并仔细指定您将用于通信的协议,然后才能实际编码接收和发送方。
答案 1 :(得分:0)
ReadLine只会在到达文件末尾时返回NULL。发送数据后,您是否在客户端关闭管道?