c++ - 如何在 C++ 中将结构映射到 char 正确的方法

标签 c++ networking struct

在 C 中,我习惯于使用 char*,我将一些表示网络数据包的结构映射到它。然后我只分配数据包参数并通过网络发送:

已更新 - 我忘记补充说我有一些有效载荷

struct packet {
   uint64_t id __attribute__((packed)); 
   uint64_t something __attribute__((packed));
   short flags __attribute__((packed));
   // here follows payload with variable length
};
...
char *payload = get_payload();
size_t payload_size = get_payload_size();//doesnt matter how
char *data = malloc(sizeof(struct packet)+payload_size);
struct packet *pkt = (struct packet *)data;
pkt->id = 123;
pkt->something = get_something();
pkt->flags = FLAG | FLAG2;
memcpy(data+sizeof(struct packet), payload, payload_size);
send(data, sizeof(struct packet)+payload_size);

现在我想用一些不错的 C++ 特性来实现它(如果有更好的方法的话) 我能在 C++ 中做的最好的改变是使用 new 而不是 malloc。

char *data = new char[sizeof(struct packet)];//rest is same

好的,这称为对象序列化。我发现有几个示例总是使用我不能使用的 boost。C++ 中没有本地方法来完成这个吗?

最佳答案

没有理由创建一个char* 和一个pkt*。您创建并发送一个对象,例如:

packet pkt;  // create automatic object
pkt.id = 123;
pkt.something = get_something();
pktflags = FLAG | FLAG2;
// here we cast the address of pkt to a char* so we can send it
send(reinterpret_cast<char*>(&pkt), sizeof(packet));

编辑:

由于问题已更新为将有效载荷添加到 struct 数据的末尾,您将不得不使用与在 C 中所做的相同的方法。当您 new 向上指针的语法将是

char * data = new char[sizeof(packet) + payload_size];

此外,当像在 C 中那样使用 struct 时,C++ 中不需要 struct 关键字。您只需按名称使用即可。

关于c++ - 如何在 C++ 中将结构映射到 char 正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227436/

相关文章:

c++ - 如何在我的 C++ 程序中使用和启动 exe 文件?

c# - 解析IP失败

c - 释放结构指针是否也会释放 C 中结构内部分配的内存?

C++:尝试通过组合和帕斯卡三角来理解 constexpr

c# - 使用socket编程连接SqlServer

c++ - 如何将谓词作为函数参数传递

Android 中的 Java,帮助连接到 wifi 网络,并在不成功时尝试重新连接

c - 使用 rio_readlineb 读取图像,但不起作用

c - 在c中重新分配结构

c - 结构中的多种类型 - C