C PeekNamedPipe始终为totalBytesAvailable返回0

C PeekNamedPipe始终为totalBytesAvailable返回0,c,windows,named-pipes,C,Windows,Named Pipes,我已经在其他地方将字节写入管道,但是totalBytesAvailable总是0,为什么?这是一个老问题,但我还没有在网上找到答案,所以我想我还是会回答它。您必须循环直到管道读取,以下是我的工作代码: PeekNamedPipe( tmp_pipe, // __in HANDLE hNamedPipe, NULL, // __out_opt LPVOID lpBuffer, 0,

我已经在其他地方将字节写入管道,但是totalBytesAvailable总是
0
,为什么?

这是一个老问题,但我还没有在网上找到答案,所以我想我还是会回答它。您必须循环直到管道读取,以下是我的工作代码:

  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 
  ); 

当然,这只有在您确定有数据等待读取时才有效,否则您将陷入一个无休止的循环中,因为实际上没有数据要读取,所以它将始终为0

我发现在Windows中,如果在调用
ReadFile
之前调用
PeekNamedPipe
,它将始终返回零字节,即使实际上有字节要读取。您必须调用
ReadFile
,后跟
PeekNamedPipe
,并保持循环,直到
PeekNamedPipe
返回零字节


我注意到,即使在这些情况下,有时
PeekNamedPipe
也会返回零字节,即使还有字节需要获取。一定是时间问题。发送方必须在每条消息的前面加上字节计数。唉…

你用的是哪种语言?您确定函数或以前的函数调用没有返回错误吗?为什么需要循环直到管道读取?
PeekNamedPipe()
本身会阻塞,直到读取完成。如果要在有数据读取之前进行阻止,可以在阻止模式下调用
ReadFile()
,即
CreateFile()中的
PIPE\u WAIT
puncility:DWORD bytesAvail=0;
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);