通过 C++ 中的 udp 套接字将派生的 class 对象从一个进程发送到另一个进程
Send an derived class object from one process to another via udp socket in c++
假设我们有一个 class,称为 Derived,继承自 class,称为 Base。这两个 classes 仅包含连续内存区域中的数据。是否可以通过网络发送派生 class 的对象而不实现任何特殊函数来序列化和反序列化对象的成员? 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;
}
一般来说,您不应该通过网络发送指针。不同的 OS、不同的硬件、不同的编译器、不同的编译器版本,甚至不同的程序构建 - 都可能破坏代码。我什至不提接收数据有错误的可能性。
最佳建议:制定简单的约定 - 它是什么类型的数据以及它的用途。在基本程序中,您甚至可以简化它(直到您的 TCP 套接字因未知原因无法接收发送的数据,这发生在我身上)。
假设我们有一个 class,称为 Derived,继承自 class,称为 Base。这两个 classes 仅包含连续内存区域中的数据。是否可以通过网络发送派生 class 的对象而不实现任何特殊函数来序列化和反序列化对象的成员? 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;
}
一般来说,您不应该通过网络发送指针。不同的 OS、不同的硬件、不同的编译器、不同的编译器版本,甚至不同的程序构建 - 都可能破坏代码。我什至不提接收数据有错误的可能性。
最佳建议:制定简单的约定 - 它是什么类型的数据以及它的用途。在基本程序中,您甚至可以简化它(直到您的 TCP 套接字因未知原因无法接收发送的数据,这发生在我身上)。