C ++到C#命名管道在客户端读取时挂起

时间:2015-06-08 17:57:56

标签: c# c++ ipc named-pipes

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并在循环中查看输入数据。

0 个答案:

没有答案