Вопрос

Не мог бы кто-нибудь, пожалуйста, помочь и рассказать мне, как использовать буферы протокола.На самом деле я хочу обмениваться данными через сокеты между программой, работающей в 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 и архивы списков рассылки для получения дополнительной информации об этой технике.)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top