![](/img/trans.png)
[英]Convert a float to a byte[] in order to send through a named pipe (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.