使用命名管道在C#和C ++之间进行IPC

时间:2014-09-05 03:00:25

标签: c# c++ ipc pipe

我有一个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”

经过一些调试后,我注意到了一些奇怪的事情:

  1. client.Connect();导致2个字节(不是空终止)写入管道。这解释了“????? ...”
  2. “Messege0”从客户端正确编写,服务器也正确读取,但是:
  3. 客户端似乎没有正确读取服务器的回复(“来自服务器的默认回答”) - 它被卡在阻塞的“reader.ReadLine()”行上。我认为这不是因为服务器上的错误,因为同一服务器似乎可以正常使用C ++客户端。
  4. 关闭服务器后,邮件将发送到客户端。我添加了

    FlushFileBuffers(hPipe);

  5. WriteFile()  
    

    在服务器中 - 它没有帮助。

    • 双方编码似乎都是正确的 - Unicode,Little Endien。

    • 服务器和客户端都在同一台Windows计算机上运行。

    项目编号3中的问题对我来说是最令人不安的,我找不到解释。

0 个答案:

没有答案