使用命名管道在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);
}
...
...
...
}
我错过了什么?
答案 0 :(得分:1)
IO看起来很实用。您忘记了服务器中的WaitForConnection
,并且您忽略了所有返回代码,例如每个ReadByte()
都可以返回-1而不是数据。
很可能,问题是准备要发送的缓冲区的代码,您还没有将其包含在您的问题中。
len = ioStream.ReadByte() * 64;
len += ioStream.ReadByte();
这是发送/接收缓冲区长度的非正统方式。
如果在每条消息之前需要16位长度值,请向数组中读取两个字节,调用BitConverter.ToUInt16
使它们成为一个数字,并且不要忘记在C ++端应用相同的约定。