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