буферы протокола — реализация Protobuf ParseDelimitedFrom в переполнении стека

C # Publisher публикует непрерывные сообщения рыночных данных в произвольном формате protobuff через сокет с помощью API «writeDelimitedTo». Я должен прочитать все сообщения в C ++ и десериализовать его. Ниже мой код. Поскольку в C ++ нет «parseDelimitedFrom», закодируйте что-то вроде ниже, пройдя через несколько предложений на этом форуме.

Теперь мой вопрос: ссылаясь на код ниже, если первый размер сообщения меньше 1024, то на первой итерации у меня будет полный поток 1-го сообщения и часть потока из 2-го сообщения. После десериализации первого сообщения, Как я могу прочитать оставшиеся потоки второго сообщения из сокета и объединить его с потоком, который я прочитал в предыдущей итерации?

1

Решение

Я написал оптимально эффективные версии parseDelimitedFrom а также writeDelimitedTo в C ++ здесь ( read а также write методы Uncompressed):

https://github.com/kentonv/capnproto/blob/master/c%2B%2B/src/capnp/benchmark/protobuf-common.h#L81

Не стесняйтесь копировать.

Эти реализации читают из / пишут в ZeroCopyInputStream / ZeroCopyOutputStreamХм, почему-то мой write объявлен для использования FileOutputStream, но вы должны иметь возможность просто изменить это на ZeroCopyOutputStream.)

Итак, вам нужно создать ZeroCopyInputStream который читает из вашего StreamSocket, а затем передать его моему read(),

Это выглядит как StreamSocket классический интерфейс копирования-чтения. Поэтому вы должны использовать CopyingInputStreamAdaptor как твой ZeroCopyInputStream, завернув реализацию CopyingInputStream который читает из вашего StreamSocket,

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream_impl_lite#CopyingInputStreamAdaptor

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]