C++;到C#命名管道挂起在客户端读取
C++命名管道服务器代码 此代码执行一次C++;到C#命名管道挂起在客户端读取,c#,c++,ipc,named-pipes,C#,C++,Ipc,Named Pipes,C++命名管道服务器代码 此代码执行一次 LPTSTR lpszPipename = "\\\\.\\Pipe\\D2MSPipe"; hPipe = ::CreateNamedPipe(lpszPipename, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE, // | PIPE_READMODE_MESSAGE,
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);
从这里开始,服务器等待客户端连接。这是有道理的
当客户端连接时,这里是发送数据< /P>的C++代码
LPTSTR data = "Hello";
DWORD bytesWritten = 0;
WriteFile(hPipe, data, strlen(data) * sizeof(TCHAR), &bytesWritten, NULL);
这里,BytesWrite包含5个
这是我的客户表
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);
这条线挂着。它不会抛出异常
当我进入这个指令时,它什么也不做,数据在字节数组中从未分配/可用,代码停止执行
我尝试了多种阅读方式,有流,没有流,有读行,ReadToEnd
一切都悬而未决
客户端有一个while循环,因为服务器大约每分钟发送一次数据。所以我假设我只需要连接一次,并且只需要创建一个StreamReader,然后在一个循环中窥视以读取传入的数据。您希望发生什么而不是“挂起”?我假设您想继续等待数据。问题是数据在字节数组中永远不可用。当我进入挂起的行时,它只是挂起,从不分配变量。我希望它填充字节数组,并最终继续循环,等待服务器发送下一条消息,第一次读取应该成功。然后,任何进一步的读取都可能被阻止。你确定第一次读取永远不会完成吗?