Как использовать протокол буфера? - PullRequest
7 голосов
/ 02 декабря 2009

Может кто-нибудь, пожалуйста, помогите и подскажите, как использовать буферы протокола. На самом деле я хочу обмениваться данными через сокеты между программой, работающей в Unix, и другой, работающей в Windows, чтобы проводить исследования моделирования.

Программы, использующие сокеты для обмена данными, написаны на C / C ++, и я был бы рад, если бы somneone мог помочь мне использовать буфер протокола для обмена данными в виде:

struct snd_data{
    char *var="temp";
    int var1=1;
    float var2;
    double var2;
}

Я пробовал несколько способов, но все равно данные не обмениваются правильно. Любая помощь будет очень ценится

Спасибо за вашу помощь,

Ответы [ 5 ]

13 голосов
/ 02 декабря 2009

Вы начинаете с определения своего сообщения в файле .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

3 голосов
/ 23 декабря 2009

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

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

2 голосов
1 голос
/ 02 декабря 2009

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

0 голосов
/ 02 декабря 2009

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

...