Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++<-&燃气轮机;C#命名管道通信_C#_C++_Windows_Pipe_Ipc - Fatal编程技术网

C++<-&燃气轮机;C#命名管道通信

C++<-&燃气轮机;C#命名管道通信,c#,c++,windows,pipe,ipc,C#,C++,Windows,Pipe,Ipc,使用命名管道在windows上实现IPC C命名管道服务器和C++命名管道客户端。 将数据从C++客户端发送到C server时丢失第一个字符。 例如,如果“这是一个测试消息”从C++客户端发送,服务器将接收“HIS是一个测试消息”。下面是相关代码 C++客户端代码 success = WriteFile( pipe, guiMsg, PIPE_BUFFER_SIZE, &bytesWritten, NULL); C#服务器代码 mai

使用命名管道在windows上实现IPC

C命名管道服务器和C++命名管道客户端。 将数据从C++客户端发送到C server时丢失第一个字符。 例如,如果“这是一个测试消息”从C++客户端发送,服务器将接收“HIS是一个测试消息”。下面是相关代码

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);
        }
...
...
...
    }

我缺少什么?

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

很有可能,问题在于准备发送缓冲区的代码,您的问题中没有包含该代码

        len = ioStream.ReadByte() * 64;
        len += ioStream.ReadByte();
这是发送/接收缓冲区长度的非常非正统的方法


如果在每个消息之前需要16位长度值,则将两个字节读入数组,调用<代码> BitConverter。ToutIn16/CODE >使它们成为一个数字,并且不要忘记在C++端应用相同的约定。< /P>使用DCOM。我忘了DCOM。谢谢@Ben,您可能刚刚解决了我正在处理的一个完全无关的问题。看起来读取的代码正在读取一条长度前缀消息(长度编码为2字节)。发送代码没有显示长度如何/是否作为前缀添加到消息中。@Ðаn他不能使用WCF。C++没有WCF。@本,我有一些在C++中编程DCOM的经验。不会向任何人推荐这项技术。