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,

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);
从这里开始,服务器等待客户端连接。这是有道理的

当客户端连接时,这里是发送数据< /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,然后在一个循环中窥视以读取传入的数据。

您希望发生什么而不是“挂起”?我假设您想继续等待数据。问题是数据在字节数组中永远不可用。当我进入挂起的行时,它只是挂起,从不分配变量。我希望它填充字节数组,并最终继续循环,等待服务器发送下一条消息,第一次读取应该成功。然后,任何进一步的读取都可能被阻止。你确定第一次读取永远不会完成吗?