2009-12-02 1 views
5

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

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

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

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

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

+6

Любая причина это сообщество вики? – Goz

ответ

11

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

package foo; 

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

(я предполагаю, что поплавок и дважды на самом деле это разные переменные ...)

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

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

+0

Спасибо за ответ. есть ли простой учебник, в котором показан пример? Еще раз спасибо, – make

+2

Следуйте за ссылкой, которую я включил, - это учебник, который охватывает использование буферов протокола из C++. –

1

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

+0

машины разные. Unix установлен на солнечных лучах и окнах на x86. Но я читал, что буферы протокола обрабатывают разные машины, и именно поэтому я решил использовать его ... – make

0

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

+2

@ tommieb75: Это правильно? Googling для протокольных буферов и endian показывает диалог групп Google, который указывает, что программное обеспечение правильно это обрабатывает: http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana

+0

@quamrana: Я не могу ответить на это, поскольку я не знаю буферов протокола Google, извините, что на этом. Проверьте свой состав, компилятор может заполнить его, чтобы сделать его ровным. Вы можете проверить это, выполнив sizeof (struct snd_data) на обоих концах, чтобы узнать, что это такое? Если у вас разные размеры, это может помочь вам объяснить вашу ситуацию. – t0mm13b

3

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

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

+0

Да. Подробнее см. В разделе [https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming). Протобуф "не является саморазграничивающим". –