Каковы возможные способы обмена данными в двоичном формате между Windows и Solaris? - PullRequest
2 голосов
/ 13 ноября 2009

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

Буду очень признателен за любую идею или ссылку на материалы, которые имеют к ней отношение. Заранее благодарю за помощь, Mk

Ответы [ 5 ]

6 голосов
/ 13 ноября 2009

Проверьте буферы протокола Google как быстрый способ сериализации данных.

4 голосов
/ 13 ноября 2009

Если вы против сериализации текста и действительно хотите структуру, то делайте это, как и большинство сетевых протоколов, с «хостом в сеть» при отправке и «сетью в хост» при получении всех полей в структуре.Идея состоит в том, что все отправители, независимо от того, какой порядок байтов они всегда переводят в сеть (big-endian, я забыл, что есть какой).Затем все получатели преобразуются в то, чем они являются (может быть также с прямым порядком байтов, который не меняется).

Уже есть apis для этого.Это ntohs (сеть для размещения коротких 16-битных полей) и ntohl (32-битные поля).Тогда, конечно, htons и htonl.

Итак, для такой структуры:

typedef struct
{
    unsigned char  stuff1;
    unsigned char  stuff2;
    unsigned short stuff3;
    unsigned int   stuff4;
}tFoo;

Код отправки будет выглядеть примерно так:

tFoo to_send;
to_send.stuff1 = local_stuff1;
to_send.stuff2 = local_stuff2;
to_send.stuff3 = htons(local_stuff3);
to_send.stuff4 = htonl(local_stuff4);

Код получения будетсделать что-то вроде:

local_stuff3 = ntohs(from.stuff3);
local_stuff4 = ntohl(from.stuff4);

Обратите внимание, что упаковка / выравнивание имеет значение для структуры.Вы должны быть утомлены выравниванием, которое не всегда одинаково для разных компиляторов и даже для одного и того же компилятора.Он может даже изменить для самих типов данных (тип int может быть разного размера от арки к арке).Я попытался продемонстрировать это с помощью первых двух 8-битных символов, за которыми следуют 16-битный и 32-битный, что в сумме составляет 8 байт.Вы должны быть уверены, что при переносе на другой компилятор / арку вы действительно получаете правильную упаковку / размер.

По этой причине большинство людей выбирают сериализацию и, вероятно, почему большинство людей ответили именно так.Это наименее подвержен ошибкам.

Удачи.

4 голосов
/ 13 ноября 2009

Да, вы ищете что-то вроде сериализации . Существует множество способов сделать это, в том числе:

Как правило, вы используете библиотеку, чтобы помочь вам в этом. Вы также можете столкнуться с инструментами, которые сгенерируют код, который вы можете добавить в свою программу.

1 голос
/ 13 ноября 2009

Повышенная сериализация кажется хорошим выбором.

0 голосов
/ 13 ноября 2009

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

...