通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
Send an derived class object from one process to another via udp socket in c++
假设我们有一个类,叫做 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;
}
一般来说,切勿通过网络发送指针。不同的操作系统、不同的硬件、不同的编译器、不同的编译器版本,甚至不同的程序构建 - 都可能破坏代码。我什至没有提到收到的数据出错的可能性。
最好的建议:制定简单的约定 - 它是什么样的数据以及它适用于谁。在基本程序中,您甚至可以简化它(直到您的TCP套接字由于未知原因无法接收发送的数据,发生在我身上(。
相关文章:
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 如何从另一个进程解开全局钩子?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 为什么一个进程会挂在RtlExitUserProcess/LdrpDrainWorkQueue中?
- 先进先出:一个进程永远不会从管道读取
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 如何在MPI中将矩阵从一个进程转移到另一个进程
- 如何使用一个信号灯同步 3 个进程?
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 从执事创建一个分叉进程
- 带有 QSharedMemory 的 IPC,如果其中一个进程挂起,则存在风险
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- C++ 减慢另一个正在运行的进程
- 与 Python 中子进程中的另一个应用程序的交互式会话
- 如何:监视Windows中另一个进程的文件访问?
- C++程序将进程置于前台(如果已在运行),否则创建一个新进程
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 如何在c++中处理两个进程(一个OpenGL应用程序通过相机运行手势)