C ++< - > C#命名管道通信

时间:2017-03-29 20:52:11

标签: c# c++ windows pipe ipc

使用命名管道在Windows上实现IPC。

C#命名管道服务器和C ++命名管道客户端。 从C ++客户端向C#服务器发送数据时丢失第一个字符。

例如,如果从C ++客户端发送“This is a test message”,服务器将收到“他是测试消息”。以下是重要的代码。

C ++客户端代码

    success = WriteFile(
    pipe,
    guiMsg,
    PIPE_BUFFER_SIZE,
    &bytesWritten,
    NULL);

C#服务器代码

main()
    {
        NamedPipeServerStream pipeServer =
            new NamedPipeServerStream(@"ZVMonitorPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

        StreamString ss = new StreamString(pipeServer);
        ...
        ...
        string input = ss.ReadString();
        Console.WriteLine(input);
        ...
        ...
    }

public class StreamString
    {
        private Stream ioStream;
        private UnicodeEncoding streamEncoding;

        public StreamString(Stream ioStream)
        {
            this.ioStream = ioStream;
            streamEncoding = new UnicodeEncoding();
        }

        public string ReadString()
        {
            int len = 0;

            len = ioStream.ReadByte() * 64;
            len += ioStream.ReadByte();
            byte[] inBuffer = new byte[len];
            ioStream.Read(inBuffer, 0, len);

            return streamEncoding.GetString(inBuffer);
        }
...
...
...
    }

我错过了什么?

1 个答案:

答案 0 :(得分:1)

IO看起来很实用。您忘记了服务器中的WaitForConnection,并且您忽略了所有返回代码,例如每个ReadByte()都可以返回-1而不是数据。

很可能,问题是准备要发送的缓冲区的代码,您还没有将其包含在您的问题中。

        len = ioStream.ReadByte() * 64;
        len += ioStream.ReadByte();

这是发送/接收缓冲区长度的非正统方式。

如果在每条消息之前需要16位长度值,请向数组中读取两个字节,调用BitConverter.ToUInt16使它们成为一个数字,并且不要忘记在C ++端应用相同的约定。