我有一个C ++服务器应用程序和C#客户端应用程序,我希望它们使用命名管道机制相互通信。
我想使用多线程服务器(每个服务器都会为客户端服务),我在这里找到了一个可用的代码:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365588(v=vs.85).aspx
从这里开始,它适用于C ++客户端:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365592(v=vs.85).aspx
我的目标是让这个C ++服务器与C#客户端一起工作,所以我为客户端编写了这个简单的程序:
public static void Main(string[] Args)
{
//Client
var client = new NamedPipeClientStream(".", "mynamedpipe", PipeDirection.InOut);
client.Connect();
StreamReader reader = new StreamReader(client, Encoding.Unicode);
StreamWriter writer = new StreamWriter(client, Encoding.Unicode);
int i = 0;
while (true)
{
writer.WriteLine("Message" + i.ToString() + Char.MinValue);
writer.Flush();
i++;
System.Console.WriteLine(reader.ReadLine());
Console.ReadKey();
}
}
我期望的行为是:
Client->Server: "Message1"
Server->Client: "default answer from server"
Client->Server: "Message2"
Server->Client: "default answer from server"
Client->Server: "Message3"
Server->Client: "default answer from server"
Client->Server: "Message4"
Server->Client: "default answer from server"
等等......
相反,这是我得到的输出:
管道服务器:等待\。\ pipe \ mynamedpipe上的客户端连接的主线程 客户端连接,创建一个处理线程。
管道服务器:等待\。\ pipe \ mynamedpipe上的客户端连接的主线程 InstanceThread创建,接收和处理消息。
客户请求字符串:“??????????????????????????????????????????? ??????????????? ?????????????????????????????????????????????????? ?????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????? ?????????????????????????????????????????????????? ?????????“
客户请求字符串:“Message0”
经过一些调试后,我注意到了一些奇怪的事情:
关闭服务器后,邮件将发送到客户端。我添加了
FlushFileBuffers(hPipe);
后
WriteFile()
在服务器中 - 它没有帮助。
双方编码似乎都是正确的 - Unicode,Little Endien。
服务器和客户端都在同一台Windows计算机上运行。
项目编号3中的问题对我来说是最令人不安的,我找不到解释。