Общий вопрос о сокете - перенос структур C ++ с Java на C ++ - PullRequest
4 голосов
/ 06 августа 2010

У меня есть общий вопрос по программированию сокетов.

У меня есть структура C под названием Data:

struct data {
      double speed;
      double length; 
      char carName[32];
      struct Attribs;
}

struct Attribs {
      int color;
}

Я хотел бы иметь возможность создать подобную структуру в Java, создать сокет, создать пакет данных с вышеуказанной структурой и отправить его слушателю сокета C ++.

Что вы можете сказать мне о сериализации данных (в основном, 1 и 0, которые передаются в пакете). Как C ++ «читает» эти пакеты и воссоздает структуру? Как такие структуры хранятся в пакете?

Как правило, все, что вы можете сказать мне, чтобы дать мне идеи о том, как решить этот вопрос.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 августа 2010
  • Будьте утомлены порядком байтов, если вы используете двоичную сериализацию.JVM от Sun - Big Endian, и если вы используете Intel x86, значит, вы находитесь на машине с прямым порядком байтов.
  • Я бы использовал Java ByteBuffer для быстрой нативной сериализации.ByteBuffers являются частью библиотеки NIO, поэтому, предположительно, более высокая производительность, чем у старых DataInput / OutputStreams.
  • Будьте особенно утомлены сериализацией поплавков!Как указывалось выше, безопаснее передавать все ваши данные в символьные строки по проводам.
  • На стороне C ++, независимо от сети, в какой-то момент у вас будет заполненный буфер данных.Таким образом, ваш код десериализации будет выглядеть примерно так:

size_t amount_read = 0;
data my_data;
memcpy(buffer+amount_read, &my_data.speed, sizeof(my_data.speed))
amount_read += sizeof(my_data.speed)
memcpy(buffer+amount_read, &my_data.length, sizeof(my_data.length))
amount_read += sizeof(my_data.length)
  • Обратите внимание, что размеры базовых типов C ++ определяются реализацией, поэтому примитивные типы в Java и C ++ непрямо переведи.
  • Вы можете использовать Google Protocol буферы.Мое предпочтительное решение, если речь идет о различных структурах данных.
  • Вы также можете использовать JSON для сериализации.
0 голосов
/ 06 августа 2010

Базовый процесс:

  • Java-приложение создает некоторую переносимую версию структур в Java-приложении, например XML
  • Java-приложение отправляет XML в приложение C ++ через сокет
  • Приложение C ++ получает XML из Java-приложения
  • Приложение C ++ создает экземпляры структур, используя данные в сообщении XML
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...