Как использовать буферы протокола?

Изменение table_name и field для соответствия имени таблицы и рассматриваемому полю:

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE INSTR(field, 'foo') > 0;

7
задан 3 revs, 2 users 74% 24 December 2009 в 13:15
поделиться

4 ответа

Вы начинаете с определения вашего сообщения в файле .proto:

package foo;

message snd_data {
  required string var= 1;
  required int32 var1 = 2;
  optional float var2 = 3;
  optional double var3 = 4;
}

(я полагаю, что float и double на самом деле разные переменные ...)

Затем вы компилируете его, используя ] protoc , а затем у вас есть код, реализующий ваш буфер.

Для получения дополнительной информации см .: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

13
ответ дан 6 December 2019 в 10:00
поделиться

Обе машины x86? В противном случае вам нужно следить за различиями с прямым и обратным порядком байтов. Также стоит обратить внимание на упаковку структуры. Передача указателя также может быть проблематичной из-за того, что указатели имеют разные размеры на разных платформах. В общем, в вашем посте слишком мало информации, чтобы с уверенностью сказать, что происходит не так ...

1
ответ дан 6 December 2019 в 10:00
поделиться

Ответ заключается в порядке байтов передаваемых данных, это то, что вам нужно очень внимательно рассмотреть и проверить. Посмотрите здесь , чтобы показать, что может делать порядок байтов и приводить к искажению данных как на получателе, так и на отправителе. Не существует такой идеальной меры плавной передачи данных, просто потому, что данные, отправленные из окна unix, гарантируют, что данные в окне окна будут в том же порядке с точки зрения структуры памяти для данных. Кроме того, заполнение структуры в блоке unix будет отличаться от заполнения в блоке Windows, оно сводится к тому, как используются переключатели командной строки, подумайте о выравнивании структуры.

0
ответ дан 6 December 2019 в 10:00
поделиться

Как вы пишете свои сообщения на сокет? Protobufs сам по себе не чувствителен к эндиану, но и протобуфы не определяют транспортный механизм -- protobuf определяет связку между сообщением и его сериализованной формой (которая представляет собой последовательность (8-битных) байт), и передача этой последовательности байт на удаленный хост является вашей обязанностью.

В нашем случае мы определяем очень простой транспортный протокол; сначала мы записываем размер сообщения в виде 32-битного целого числа (big endian), а затем приходит само сообщение. (Также помните, что сообщения protobuf не являются самоидентифицирующимися, что означает, что вам нужно знать, какое сообщение вы посылаете. Обычно это управляется наличием оберточного сообщения , содержащего необязательные поля для всех сообщений, которые вы хотите отправить. Дополнительную информацию об этом способе можно найти на сайте protobuf и в архивах списков рассылки)

.
3
ответ дан 6 December 2019 в 10:00
поделиться