WriteFile блокируется при записи в именованный пайп
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.08.21 23:40
Оценка:
Здравствуйте!

Есть именованный локальный пайп — "\\.pipe\mypipe". Делаю коннект к нему через CreateFile — всё ок. Пытаюсь что-то записать при помощи WriteFile — и всё, поток блокируется. И сервер и клиент — крутятся в одном потоке. WriteFile вызываю без overlapped параметра. Получается, что он ждет, пока сервер не прочитает записанное? Получается, без overlapped'а никуда?

Пока сделал так:

winPipeClientHandle = QSharedPointer<win::Handle>( new win::Handle(h) );

DWORD pipeState = 0, pipeCurInstances = 0, pipeMaxCollectionCount = 0, pipeCollectDataTimeout = 0;

GetNamedPipeHandleState( *winPipeClientHandle
                       , &pipeState
                       , &pipeCurInstances
                       , &pipeMaxCollectionCount
                       , &pipeCollectDataTimeout
                       , 0 // lpUserName
                       , 0 // nMaxUserNameSize ignored while lpUserName isBreaked0
                       );

DWORD newMode = (pipeState & PIPE_READMODE_MESSAGE) ? PIPE_READMODE_MESSAGE : PIPE_READMODE_BYTE;
newMode |= PIPE_NOWAIT;

SetNamedPipeHandleState( *winPipeClientHandle
                       , &newMode
                       , &pipeMaxCollectionCount
                       , &pipeCollectDataTimeout
                       );


После этого WriteFile не блокируется.

Не совсем понял, при вызове SetNamedPipeHandleState действие аффектится на оба конца пайпа или только на хэндл, для которого вызываем?

Если на оба конца (то бишь, на сам объект пайпа, а не на его хэндлы), то могут быть проблемы. Пайп сервер кутишный, как он на такое отреагирует — хз.

Ну и то, что надо пайп поднастраивать — как-то неудобно. Хотелось бы, чтобы виндовые проги, работающие нормально через ReadFile/WriteFile, так же нормально и без переделок работали бы с пайпом
Маньяк Робокряк колесит по городу
Отредактировано 14.08.2021 1:28 Marty . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.