Я создал именованный канал со следующими флагами:
- PIPE_ACCESS_DUPLEX - доступ на чтение / запись на обе стороны
- PIPE_TYPE_MESSAGE - чтение типа сообщения
- PIPE_WAIT - блокировка чтения \ записи
Со стороны сервера я звоню ConnectNamedPipe и жду подключения клиентов.
Со стороны клиента я звоню CallNamedPipe , чтобы подключиться к серверу и записать данные длиной N.
На стороне сервера:
- После подключения клиента вызывается PeekNamedPipe для получения длины буфера, выделяемого для чтения буфера данных.
- После получения точного размера буфера (N) я выделяю буфер длины N и вызываю ReadFile для чтения данных из Pipe.
Проблема:
- Проблема в том, что - на однопроцессорных компьютерах API PeekNamedPipe возвращает длину буфера как 0. Из-за этого позже ReadFile завершается ошибкой.
- после некоторого исследования я обнаружил, что из-за некоторого состояния гонки PeekNamedPipe API вызывается даже до того, как клиент помещает данные в Pipe.
- Есть идеи, как решить это условие гонки? Мне нужно вызвать PeekNamedPipe, чтобы получить размер буфера, и PeekNamedPipe нельзя вызвать до того, как станут доступны данные.
Я думал о введении пользовательского заголовка для указания длины буфера в самом сообщении, но это звучит много изменений.
Есть ли лучший и надежный способ получить длину данных, которые будут считываться из канала?