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
,为什么?
答案 0 :(得分:1)
我发现在Windows中,如果在调用PeekNamedPipe
之前调用ReadFile
,它将始终返回零字节,即使实际上有要读取的字节也是如此。您必须调用ReadFile
,然后调用PeekNamedPipe
,并继续循环,直到PeekNamedPipe
返回零字节。
我注意到即使在这些情况下,即使有剩余的字节,有时PeekNamedPipe
也会返回零字节。必须是时间的事情。发送方必须在每个消息前面加上字节数。叹息...
答案 1 :(得分: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);
当然,这只有在您确定有数据等待读取时才有效,否则您将陷入无限循环,因为实际上没有数据要读取,所以它总是为0。