Обработка потоковых данных через каналы - PullRequest
1 голос
/ 16 декабря 2009

Приложение Win32 («сервер») отправляет непрерывный поток данных по именованному каналу. GetNamedPipeInfo () говорит мне, что размеры входного и выходного буфера автоматически распределяются по мере необходимости. Канал работает в байтовом режиме (хотя он отправляет блоки данных, размер которых превышает 1 байт (точнее, удваивается)).

Теперь мой вопрос таков: могу ли я каким-то образом проверить, что мое приложение («клиент») не пропускает какие-либо данные при чтении из канала? Я знаю, что эти операции чтения / записи буферизуются, но я полагаю, что буферы не будут расти бесконечно, если клиент не получит данные достаточно быстро. Как узнать, что я что-то пропустил? Сервер (или канал?) Молча отбрасывает данные, которые клиент не читает вовремя?

Кстати, могу ли я рассчитывать на правильное выравнивание данных, которые клиент читает с помощью ReadFile ()? Насколько я понял, ReadFile () может вернуть с меньшим количеством прочитанных байтов, чем указано, то есть NumberOfBytesRead <= NumberOfBytesToRead. Нужно ли проверять каждый раз, когда NumberOfBytesRead кратно sizeof (double)? </p>

Ответы [ 2 ]

1 голос
/ 16 декабря 2009

Операция записи блокируется, если в буферах канала больше нет места. Это из моей (старой) копии руководства по SDK:

Когда приложение использует WriteFile функция записи в трубу, запись операция может не закончиться, если труба буфер заполнен Операция записи завершается, когда операция чтения (с использованием функция ReadFile) делает больше доступно буферное пространство.

0 голосов
/ 17 декабря 2009

Извините, не выяснил, как прокомментировать ваше сообщение, Нил.

Операция записи блокируется, если в буферах канала больше нет места.

Я только что обнаружил, что FileMon от Sysinternals также может отслеживать операции с конвейерами. В целях тестирования я подключил клиента к именованному каналу и выполнил no операции чтения, просто ожидая. Сервер записывает несколько сотен килобайт в канал каждые 4-5 секунд, хотя никто не получает данные из канала на стороне клиента. Нет операции блокирующей записи ... И до сих пор, похоже, не было достигнуто никаких ограничений на размер буфера.

Это либо очень большой буфер ... либо сервер делает некоторые дополнительные действия, просто используя WriteFile () и ожидая, пока клиент прочитает.

...