【问题标题】:Named Pipe messages not getting through (Windows / C++)命名管道消息未通过 (Windows / C++)
【发布时间】:2013-06-27 12:57:37
【问题描述】:

尝试从命名管道读取。据我所知,客户端连接正常并发送。考虑到代码是从这里的解决方案中获取的,我很难看出我在哪里搞砸了。 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");

【问题讨论】:

  • Flushing 似乎在发送消息后带有一堆废话。
  • 好的,知道如何发送一条消息吗? Flush 最后给了我一堆乱七八糟的东西?或者我需要在另一端添加后缀并检查?

标签: c# c++ named-pipes


【解决方案1】:

C# 的 StreamWriter 可能会缓冲直到发生刷新,因此您在那里回答了自己的第一个问题。 C# 不会以空值终止字符串(ReadFile 也不会 - 它不对您正在读取的数据做任何假设,因为它可能会关心您的数据可能是二进制的),但是您正在使用您得到的数据ReadFile 就像一个 c 字符串(以空字符结尾的字符串)。所以 Write 会看到 {'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' [arbitrary bytes]}。写入将继续读取内存,直到找到一个空字符,此时它停止。所以所有的垃圾都是任意的废话,直到 Write 偶然发现一个空字符。

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

【讨论】:

  • 天哪,我觉得自己像个白痴。自从我处理字符数组以来已经有一段时间了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多