2017-01-14 1 views
0

Я использую nanomsg для переноса частей моих данных из Windows в CentOS.После nn_send nn_socket запретит немедленно отправлять следующую часть данных в режиме Req/Rep

На данный момент я использую Req/Rep режим.

CentOS отправит сообщение Req -request, а «Windows» ответит Rep.

Это выглядит хорошо.

Но части данных, на которые я отвечаю, имеют смешанные несколько структур. Головка данных следующая с несколькими кадрами данных.

Я хочу отправить их по одному.

Но в соответствии с nanomsg Req/Rep должен просто отправить запрос и получить ответ по одному за раз. Это все.

Так что, если я отправлю голову, nn_socket запретит мне отправлять фрейм данных.

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

Есть ли способ отправить их по одному вместо отправки вместе?

Спасибо!

+0

кажется, следует использовать nn_sendmsg ........ – norikoSD

ответ

0

Что-то вроде буферов протокола Google будет вашим другом здесь.

nanomsg отправляет полные сообщения. Это просто вопрос того, что такое «сообщение». По сути, это всего лишь набор байтов, которые он обеспечивает для доставки. Это зависит от вас, что представляют собой эти байты.

Здесь поступают буферы протокола Google (или JSON, или XML, или ASN.1 [мой личный любимый], и есть много других, чтобы выбрать). Это позволяет вам определять структуры сообщений, соответствующие вашим потребностям, и затем генерирует код, который сериализует и десериализует эти сообщения. Вы записываете свой код в сериализацию/десериализацию в буферы (байтовые массивы, строки, что угодно), которые вы передаете в виде сообщений с помощью nanomsg.

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

Я упоминаю ГПБ, потому что это бесплатно, достаточно просто

+1

Как я уже отметил, мы могли бы использовать nn_sendmsg разрешить мою ситуацию. И все в порядке. И я немного знаю о буферах протокола Google, спасибо ~~ – norikoSD

+0

@norikoSD nn_sendmsg это сделает, но если у вас сложная иерархия структур, вы должны писать что-то вроде глубокой копии. Это может быть очень много работы, должно быть сделано правильно везде, когда сообщения отправляются и принимаются, и их нужно переделывать каждый раз, когда вы хотите изменить состав структуры. И ошибка, допущенная только в одном месте, может привести к хаосу. И вам все равно придется беспокоиться о различиях в структуре упаковки в GCC и, предположительно, MSC. Лично я ленив, поэтому я предпочитаю использовать что-то вроде GPB, что позволяет мне избежать необходимости делать это сам и более гибко. – bazza

+0

@norikoSD, если вы хотите что-то быстрее, чем GPB, вы можете попробовать Capn Proto https://capnproto.org/. Это ставит целью создать естественные структуры в своей программе, которые просто копируются байтом, а не сериализуются, но учитывают различия в макете между различными платформами. Это может быть хорошим компромиссом между полным набором сериализаторов, таких как GPB и необработанные структуры. – bazza

Смежные вопросы