LINUX.ORG.RU

Пример c++ сокет сервера и json парсера.

 , ,


0

3

Подскажите пожалуйста нормальный пример реализации сервера и парсера.

Интересует в частности, как правильно парсить jsonstring если она превышает размер принимающего буфера (буфер, который является параметром для команды recv ). Подскажите алгоритм или укажите где почитать.

Ответ на: комментарий от DELIRIUM

Но ведь json нормально парсится банальной стейт-машиной.

Прям с языка снял.

ThinkDifferent
()

Парсер джейсона - конечный автомат, травишь ему посимвольно (в теории - бесконечный) поток, он в зависимости от состояния трактует символ как надо, временами выплевывая законченные объекты.

Ну или навелосипедить свой протокол поверх голого TCP, или что у тебя там, и ввести понятие Content-Length.

yoghurt ★★★★★
()

Для сервера смотри boost asio, так есть примеры.

anonymous
()
Ответ на: комментарий от ThinkDifferent

В моём оригинальном сообщении джейсон == json. Курс по грамматикам и автоматм помню, Джейсона - что-то не помню ;-)

yoghurt ★★★★★
()

Есть вот такой потоковый парсер https://github.com/kazuho/picojson

Если пришло полсообщения сохраняй в отдельный буффер, жди остаток, докидывай и пробуй пасрить снова. Если полтора он вернет тебе итератор на конец первого распаршенного сообщения в буфере ну и т.д

udhv
()
Ответ на: комментарий от udhv

Есть вот такой потоковый парсер

Спасибо , посмотрим.

Ну или навелосипедить свой протокол поверх голого TCP, или что у тебя там, и ввести понятие Content-Length.

Поподробней можно или ссылки может найдутся?

FreakMurderer
() автор топика

гуглю за деньги

дорого

anonymous
()

I/O сервак рекомендую запилить на boost::asio, а по потоковому JSON парсеру тут уже подсказали: picojson. Пример можно взять из этого поделия, только заменить HTTP на JSON.

illy
()
Ответ на: комментарий от yoghurt

Парсер джейсона - конечный автомат, травишь ему посимвольно (в теории - бесконечный) поток, он в зависимости от состояния трактует символ как надо, временами выплевывая законченные объекты.

Имеет ли смысл в recv принимать в односимвольный буфер или принимать в стандартный (напр 512 ячеек), а потом уже из стандартного посимвольно в автомат.

Не кеширует ли recv , даже если буфер односимвольный?

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Принимай хоть по 4k, главное проверяй сколько байт он на самом деле принял.

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.