命名管道消息无法通过(Windows / C ++)

时间:2013-06-27 12:57:38

标签: c# c++ named-pipes

尝试从命名管道中读取。据我所知,客户端连接正常并发送。考虑到代码来自这里的解决方案,我很难看到我搞砸了。 Readfile似乎没有得到任何东西。它不会回来。 如果在客户端关闭连接,则返回0。

任何想法?

DWORD WINAPI LogManager::LogCollector(LPVOID args)
{
    LogMan *LogMgr = (LogMan*)args;
    int run; LogMgr ->GetValue(run);

    while (run != LogMan::eNONE) {
        HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\RCLogPipe", PIPE_ACCESS_INBOUND , PIPE_WAIT, 1, 1024, 1024, 120 * 1000, NULL);
        ConnectNamedPipe(pipe, NULL);
        if (pipe == INVALID_HANDLE_VALUE){
            CloseHandle(pipe);
            return -1;
        }
        char line[1024];
        DWORD numRead = 0;
        if (!ReadFile(pipe, line, 1024, &numRead, NULL) || numRead < 1) return -1;
        LogMgr ->Write(line);
        LogMgr ->GetValue(run);
        CloseHandle(pipe);
    }
    return 0;
}

客户端

var client = new NamedPipeClientStream("RCLogPipe");
client.Connect();
StreamWriter writer = new StreamWriter(client);
if (client.CanWrite) writer.WriteLine("Hello\n");

1 个答案:

答案 0 :(得分:4)

C#的StreamWriter可能会缓冲直到刷新,所以你在那里回答了你自己的第一个问题。 C#没有空终止字符串(ReadFile也没有 - 它不会假设您正在读取的数据,因为它可能会关心您的数据可能是二进制的),但是您正在使用您获得的数据ReadFile就像一个c-string(以null结尾的字符串)。所以Write会看到{'h''e'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''de写入将继续通过内存读取,直到找到空字符,此时它将停止。所以所有的垃圾都是随意的垃圾,直到Write偶然找到一个空字符。

您需要使用numRead值将其传递给Write以告知它要查看多少缓冲区,或者使用它来手动空终止字符串 - line[numRead] = '\0'; - 假设您有空间在缓冲区。