Сериализация структуры и отправка ее через сокет с C ++ - PullRequest
1 голос
/ 31 января 2011

Я бы отправил структуру через сокеты C ++.Это пример структуры:

struct PIPPO
{
int x;
int y;
};

, которую я использую с:

PIPPO test2;
test2.x = 10;
test2.y = 20;

, и у меня есть код выше для сериализации и отправки его через сокет.Проблема в том, что если я пытаюсь получить значение HEX тестовой переменной, я вижу только 0A и воздействую на другой компьютер, который получает данные, я не могу преобразовать двоичные данные в структуру.Кто-нибудь может мне помочь?

template <class T> void SerializeData(char *outputArray, T inputData)
{
memcpy(outputArray, &inputData, sizeof(inputData));
}

char *StrToHexStr(char *str)
{
    char *newstr = new char[(strlen(str)*2)+1];
    char *cpold = str;
    char *cpnew = newstr;

    while('\0' != *cpold) {
        sprintf(cpnew, "%02X", (char)(*cpold++));
        cpnew+=2;
    }
    *(cpnew) = '\0';
    return(newstr);
}

char *test = new char[sizeof(PIPPO)];

memcpy((void *)&test, (void *)&test2, sizeof(test2));

send(this->m_socket, test, strlen(test), 0);

Ответы [ 4 ]

7 голосов
/ 31 января 2011

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

2 голосов
/ 31 января 2011

Ваш код не совсем понятен, но если ваш отправитель и получатель находятся на одной платформе, все что вам нужно сделать, это что-то вроде следующего ...

PIPPO to_send;
to_send.x = 10;
to_send.y = 20;

// just send the structure
send(this->m_socket, reinterpret_cast<const char*>(&to_send), sizeof(to_send), 0);

на стороне получателя ..

PIPPO to_receive;
// now read directly into the structure
recv(this->m_socket, reinterpret_cast<char*>(&to_receive), sizeof(to_receive));

Этот подход должен работать нормально, если используется та же платформа, если вам не нужна обратная совместимость протоколов и т. Д.

1 голос
/ 31 января 2011


для отправки текстового представления вы можете использовать библиотеку boost :: serialization .Он хорошо документирован и поддерживает такие функции, как:
1. (де) сериализация константеров
2. (де) сериализация дерева объектов
3. Указатели на объекты (де) сериализация
4.Полиморфная (де) сериализация
5. Полная безопасность типов
и многое другое ..

На самом деле, я думаю, что внутри есть какой-то генератор черной магии:)

С уважением, Марсин

0 голосов
/ 31 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...