[英]PeekNamedPipe always returns 0 for totalBytesAvailable
PeekNamedPipe(
tmp_pipe, // __in HANDLE hNamedPipe,
NULL, // __out_opt LPVOID lpBuffer,
0, // __in DWORD nBufferSize,
NULL, // __out_opt LPDWORD lpBytesRead,
&totalBytesAvailable, // __out_opt LPDWORD lpTotalBytesAvail,
NULL // __out_opt LPDWORD lpBytesLeftThisMessage
);
我已將字節寫入其他地方的管道,但totalBytesAvailable始終為0
,為什么?
我發現在Windows中,如果在調用ReadFile
之前調用PeekNamedPipe
,它將始終返回零字節,即使實際上有要讀取的字節也是如此。 您必須調用ReadFile
,然后調用PeekNamedPipe
,並繼續循環,直到PeekNamedPipe
返回零字節。
我注意到即使在這些情況下,有時PeekNamedPipe
返回零字節,即使還有剩余的字節。 必須是時間的事情。 發送方必須在每個消息前面加上字節數。 嘆...
這是一個老問題,但我沒有在網上找到答案所以我想我還是會回答它。 你必須循環直到管道讀取,這是我的工作代碼:
DWORD bytesAvail = 0;
while(bytesAvail==0){
if( !PeekNamedPipe(pipeHandle, NULL, 0, NULL, &bytesAvail, NULL) ){
printf("PeekNamedPipe error %d.\n", GetLastError()); //error check
}
}
printf("Bytes available: %d\n", bytesAvail);
當然,這只有在您確定有數據等待讀取時才有效,否則您將陷入無限循環,因為實際上沒有要讀取的數據,所以它總是為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.