Windows частичное чтение именованной трубы - PullRequest
0 голосов
/ 05 февраля 2020

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

1 Ответ

0 голосов
/ 07 февраля 2020

PIPE_TYPE_BYTE установлен на стороне, которая создает именованный канал.

На стороне чтения установите режим PIPE_READMODE_BYTE для чтения частичных данных.

В режиме частичного чтения вы можете использовать комбинацию PIPE_READMODE_BYTE и PIPE_NOWAIT, чтобы избежать зависания функции ReadFile. Параметр lpNumberOfBytesRead можно использовать для определения наличия данных для чтения. Если нет данных для чтения, lpNumberOfBytesRead будет нулевым, если вызов функции ReadFile успешен. В противном случае проверьте ошибку, вызвав функцию GetLastError.

На основании официального примера: Клиент именованных каналов и Многопоточный сервер труб .

Клиент код, связанный с чтением, изменится на:

dwMode = PIPE_READMODE_BYTE | PIPE_NOWAIT;// PIPE_READMODE_MESSAGE;
fSuccess = SetNamedPipeHandleState(
    hPipe,    // pipe handle 
    &dwMode,  // new pipe mode 
    NULL,     // don't set maximum bytes 
    NULL);    // don't set maximum time 

// ...

WCHAR rdWChar;
do
{
    // Read from the pipe. 

    fSuccess = ReadFile(
        hPipe,    // pipe handle 
        &rdWChar,  // buffer to receive reply 
        2,        // test size, read two bytes per read operation
        &cbRead,  // number of bytes read 
        NULL);    // not overlapped 

    if (!fSuccess && GetLastError() != ERROR_MORE_DATA)
        break;

    wprintf(L"%c", rdWChar);
} while (cbRead); // repeat loop if there is more bytes 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...