C # Publisher публикует непрерывные сообщения рыночных данных в произвольном формате protobuff через сокет с помощью API «writeDelimitedTo». Я должен прочитать все сообщения в C ++ и десериализовать его. Ниже мой код. Поскольку в C ++ нет «parseDelimitedFrom», закодируйте что-то вроде ниже, пройдя через несколько предложений на этом форуме.
Теперь мой вопрос: ссылаясь на код ниже, если первый размер сообщения меньше 1024, то на первой итерации у меня будет полный поток 1-го сообщения и часть потока из 2-го сообщения. После десериализации первого сообщения, Как я могу прочитать оставшиеся потоки второго сообщения из сокета и объединить его с потоком, который я прочитал в предыдущей итерации?
Я написал оптимально эффективные версии 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
,
Других решений пока нет …