PeekNamedPipe всегда возвращает 0 для totalBytesAvailable - PullRequest
4 голосов
/ 09 сентября 2010
  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, почему?

Ответы [ 2 ]

1 голос
/ 23 июня 2016

Я обнаружил, что в Windows, если вы вызываете PeekNamedPipe перед вызовом ReadFile, он всегда будет возвращать ноль байтов, даже если на самом деле есть байты, которые нужно прочитать.Вы должны вызвать ReadFile, затем PeekNamedPipe и продолжать цикл до тех пор, пока PeekNamedPipe не вернет ноль байтов.

Я заметил, что даже при этих обстоятельствах иногда PeekNamedPipe возвращает ноль байтов, даже еслиостались байты, которые нужно получить.Должен быть момент времени.Отправитель должен будет предварять каждое сообщение счетчиком байтов.Вздох ...

0 голосов
/ 13 февраля 2011

Это старый вопрос, но я не нашел ответа в Интернете, поэтому решил, что все равно отвечу.Вы должны зацикливаться, пока канал не читает, вот мой рабочий код:

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.

...