簡體   English   中英

命名管道消息無法通過(Windows / C ++)

[英]Named Pipe messages not getting through (Windows / C++)

試圖從命名管道讀取。 據我所知,客戶端連接正常並發送。 考慮到代碼來自這里的解決方案,我很難看到我搞砸了。 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");

C#的StreamWriter可能會緩沖直到刷新,所以你在那里回答了你自己的第一個問題。 C#沒有空終止字符串(ReadFile也沒有 - 它不會假設您正在讀取的數據,因為它可能會關心您的數據可能是二進制的),但是您正在使用您獲得的數據ReadFile就像一個c-string(以null結尾的字符串)。 所以Write會看到{'h''e'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''de 寫入將繼續通過內存讀取,直到找到空字符,此時它將停止。 因此,所有垃圾都是隨意的垃圾,直到Write偶然找到一個空字符。

您需要使用numRead值將其傳遞給Write以告訴它要查看多少緩沖區,或者使用它來手動空終止字符串 - line[numRead] = '\\0'; - 假設你在緩沖區有房間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM