LINUX.ORG.RU

История изменений

Исправление pathfinder, (текущая версия) :

То что предлагает пончик, это слишком сложно.

у тебя всё равно будет заводится контекст хранящий состояния разбора на данный момент

Нет, есть случаи, когда не обязательно хранить контекст состояния разбора. ИМХО, то что описывает ТС как раз тот случай.

Я предложу свой вариант. У него есть свои плюсы, и свои минусы. Но с точки зрения простоты и удобства ИМХО, самый лучший. Правда нужно иметь реализацию некоторой структуры данных - кольцевого буфера. Уверен ТС сам сможет осилить написание реализации.

У нас есть кольцевой буфер фиксированного размера, такого, чтобы в него гарантировано влезло хотя бы одно сообщение максимального размера.

По мере прихода данных по сети мы записываем байты в этот кольцевой буфер «в хвост». Потом пытаемся достать полное сообщение из «из головы» буфера. Т.е. сначала проверяем, что байт в буфере набралось на заголовок. Если набралось, то достаем заголовок без извлечения (т.е. операция Peek, а не Pop) и смотрим на поле размера. По полю размера определяем полный размер сообщения. Теперь смотрим, есть ли в кольцевом буфере все сообщение целиком. Если есть, то достаем и обрабатываем. Если не получилось достать полное сообщение в этот раз, то когда придут новые данные, попытаемся достать полное сообщение снова.

Исходная версия pathfinder, :

То что предлагает пончик, это слишком сложно.

<quote>у тебя всё равно будет заводится контекст хранящий состояния разбора на данный момент</quote>

Нет, есть случаи, когда не обязательно хранить контекст состояния разбора. ИМХО, то что описывает ТС как раз тот случай.

Я предложу свой вариант. У него есть свои плюсы, и свои минусы. Но с точки зрения простоты и удобства ИМХО, самый лучший. Правда нужно иметь реализацию некоторой структуры данных - кольцевого буфера. Уверен ТС сам сможет осилить написание реализации.

У нас есть кольцевой буфер фиксированного размера, такого, чтобы в него гарантировано влезло хотя бы одно сообщение максимального размера.

По мере прихода данных по сети мы записываем байты в этот кольцевой буфер «в хвост». Потом пытаемся достать полное сообщение из «из головы» буфера. Т.е. сначала проверяем, что байт в буфере набралось на заголовок. Если набралось, то достаем заголовок без извлечения (т.е. операция Peek, а не Pop) и смотрим на поле размера. По полю размера определяем полный размер сообщения. Теперь смотрим, есть ли в кольцевом буфере все сообщение целиком. Если есть, то достаем и обрабатываем. Если не получилось достать полное сообщение в этот раз, то когда придут новые данные, попытаемся достать полное сообщение снова.