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 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.