Отправить производный объект класса от одного процесса другому через сокет udp в c ++ - PullRequest
0 голосов
/ 04 октября 2019

Допустим, у нас есть класс с именем Derived, который наследуется от класса с именем Base. Два класса содержат только данные, которые находятся в областях непрерывной памяти. Можно ли отправить объект производного класса по сети без реализации какой-либо специальной функции для сериализации и десериализации члена объекта? Что будет с vtable? Vtable сохраняет реальный адрес производных функций или просто смещение?

Посмотрите на следующий фрагмент кода

#include "pch.h"
#include <iostream>
#include "Base.h"
class Derived : public Base
{
public:
    char dummy[100];
    int c;
    ~Derived()
    {
    }
    void serialize(RtpComMsg_t msg)
    {
        msg.length = sizeof(*this);
        msg.data = reinterpret_cast<unsigned char *>(this);
        std::cout << "1.msg length" << msg.length << std::endl;
    }
};

void Base::serialize(RtpComMsg_t msg)
{
    msg.length = sizeof(*this);
    msg.data = reinterpret_cast<unsigned char *>(this);
    std::cout << "msg length" << msg.length << std::endl;
}



   //receive from network
void deserialize(void * data)
{
    Derived *d = reinterpret_cast<Derived *>(data);
}



int main()
{
     Base *b = new Derived()  ;
    b->a = 5;
    memcpy(((Derived*)b), "0xABCDEF", sizeof("0xABCDEF"));
    ((Derived*)b)->c = 10;
    RtpComMsg_t msg{};
    b->serialize(msg);
    unsigned char temp[sizeof(Derived)];
    memcpy(temp, b, sizeof(Derived));
    //send temp to network
    return 0;
}

1 Ответ

1 голос
/ 04 октября 2019

Вообще говоря, вы никогда не должны отправлять указатель через сеть. Различная ОС, разное оборудование, разный компилятор, разная версия компилятора или даже разная сборка программы - могут привести к поломке кода. Я даже не упоминаю о том, что полученные данные имели ошибки.

Лучший совет: сделайте простые соглашения - что это за данные и для кого они. В базовых программах вы можете даже упростить это (до тех пор, пока ваш сокет TCP не сможет получить отправленные данные по неизвестной причине, случившейся со мной).

...