簡體   English   中英

PeekNamedPipe總是為totalBytesAvailable返回0

[英]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.

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