Я использую каналы, и у меня возникла тупиковая ситуация на WriteFile / ReadFile.Вот мой код:
hProbePipeRet = CreateNamedPipe(
"\\\\.\\pipe\\probePipeRet", // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
5, // client time-out
NULL); // default security attribute
Сначала я создаю свой канал, затем использую его следующим образом:
WriteFile(
hProbePipeRet, // handle to pipe
msg.c_str(), // buffer to write from
msg.size(), // number of bytes to write
&dwBytesWritten, // number of bytes written
NULL); // not overlapped I/O
И я получаю его обратно с:
fSuccess = ReadFile(
myInst->hProbePipeRet, // handle to pipe
buf, // buffer to receive data
BUFSIZE, // size of buffer
&dwBytesRead, // number of bytes read
NULL); // not overlapped I/O
Это очень просто, и у меня есть еще два канала, которые ТОЧНО выполняют одно и то же, единственное отличие состоит в том, что они находятся в другом потоке, но этот нужен мне только для базовых транзакций сообщения.
При первой попытке информация о каналах читается успешно, но со второй попытки, если я не отправлю хотя бы BUFSIZE данных, и WriteFile, и ReadFile будут заблокированы.Как я уже сказал, у меня есть еще два канала, которые выполняют одну и ту же функцию с одинаковыми функциями, и мне не нужно отправлять BUFSIZE данных для успешного взаимодействия.
РЕДАКТИРОВАТЬ: дополнительная информация
Выполнение происходит следующим образом: сообщение отправляется на сервер pipe1, сообщение принимается, а затем возвращает данные с помощью hProbePipeRet в моем проблемном коде.Данные читаются клиентом, выводятся на экран.
Другое сообщение отправляется с использованием pipe1, получено, и результат снова отправляется в hProbePipeRet, клиент ожидает как минимум BUFSIZE информации, и я не знаю, что делает сервер, но он заблокирован в WriteFile.
Этот сценарий аналогичен другим моим каналам, но я не помещаю hProbePipeRet в отдельный поток для чтения из него.Я делаю это, потому что мне нужен ответ сразу после отправки сообщения.