C ++命名管道服务器代码
此代码执行一次。
LPTSTR lpszPipename = "\\\\.\\Pipe\\D2MSPipe";
hPipe = ::CreateNamedPipe(lpszPipename,
PIPE_ACCESS_OUTBOUND,
PIPE_TYPE_MESSAGE, // | PIPE_READMODE_MESSAGE,
PIPE_UNLIMITED_INSTANCES,
4096,
4096,
0,
NULL);
bool b = ConnectNamedPipe(hPipe, NULL);
从此处,服务器等待客户端连接。这是有道理的。
连接客户端时,这里是发送数据的C ++代码
LPTSTR data = "Hello";
DWORD bytesWritten = 0;
WriteFile(hPipe, data, strlen(data) * sizeof(TCHAR), &bytesWritten, NULL);
这里,bytesWritten包含5。
继承我的C#客户表格
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "D2MSPipe", PipeDirection.In))
{
pipeClient.Connect();
StreamReader reader = new StreamReader(pipeClient);
while (true)
{
if (reader.Peek() > -1) {
byte[] data = new byte[5];
try
{
int wtf = pipeClient.Read(data, 0, 5);
}
catch (Exception ex)
{
throw ex;
}
}
}
pipeClient.Close(); // this doesn't make sense but whatever for now.
}
int wtf = pipeClient.Read(data, 0, 5);
此行挂起。它没有抛出异常。
当我进入这条指令时,它什么也没做,数据从未在字节数组中分配/可用,代码停止执行。
我尝试了多种方式来阅读,使用流,没有流,使用ReadLine,ReadToEnd ......
一切都挂了。
客户端有一个while循环,因为服务器每隔一分钟就会发送一次数据。所以我假设我只需连接一次并只创建一个StreamReader并在循环中查看输入数据。