Как использовать буферы протокола?
-
11-09-2019 - |
Вопрос
Не мог бы кто-нибудь, пожалуйста, помочь и рассказать мне, как использовать буферы протокола.На самом деле я хочу обмениваться данными через сокеты между программой, работающей в unix, и другой, работающей в Windows, для проведения имитационных исследований.
Программы, использующие сокеты для обмена данными, написаны на C / C ++, и я был бы рад, если бы кто-нибудь мог помочь мне использовать буферы протокола для обмена данными в виде :
struct snd_data{
char *var="temp";
int var1=1;
float var2;
double var2;
}
Я перепробовал несколько способов, но по-прежнему обмен данными происходит некорректно.Любая помощь была бы очень признательна
Спасибо за вашу помощь,
Решение
Вы начинаете с определения вашего сообщения в файле .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
Другие советы
Как вы записываете свои сообщения в сокет?Protobufs сам по себе не чувствителен к порядку окончания, но также protobufs не определяет механизм транспортировки - protobuf определяет сопоставление между сообщением и его сериализованной формой (которая представляет собой последовательность (8-битных) байтов), и это ваш ответственность за передачу этой последовательности байтов на удаленный хост.
В нашем случае мы определяем очень простой транспортный протокол;сначала мы записываем размер сообщения в виде 32-битного целого числа (big endian), затем появляется само сообщение.(Также помните, что сообщения protobuf не являются самоидентифицирующимися, что означает, что вам нужно знать, какое сообщение вы отправляете.Обычно это управляется с помощью сообщение- оболочка содержит необязательные поля для всех сообщений, которые вы хотите отправить.Смотрите веб-сайт protobuf и архивы списков рассылки для получения дополнительной информации об этой технике.)
Конечность обрабатывается внутри protobuf.
Видишь:
https://groups.google.com/forum/?fromgroups #!тема/protobuf/XbzBwCj4yL8
Являются ли обе машины x86?В противном случае вам нужно следить за большими и малыми различиями в конце.Также стоит обратить внимание на структурную упаковку.Передача указателя также может быть проблематичной из-за того, что указатели имеют разные размеры на разных платформах.В целом, в вашем посте слишком мало информации, чтобы с уверенностью сказать, что происходит не так...
Ответ кроется в конечности передаваемых данных, это то, что вам нужно очень тщательно рассмотреть и проверить.Посмотри здесь чтобы показать, что может сделать endianness и привести к путанице данных как у получателя, так и у отправителя.Не существует такой идеальной меры плавной передачи данных только потому, что данные, отправляемые из окна unix, гарантируют, что данные в окне Windows будут находиться в том же порядке с точки зрения структуры памяти для данных.Кроме того, заполнение структуры в поле unix будет отличаться от заполнения в поле Windows, это сводится к тому, как используются переключатели командной строки, например, выравнивание структуры.