c++ - 数据包转换为具有多个动态数组的结构

标签 c++ struct casting

我目前正在开发客户端/服务器应用程序,通过 TCP 发送数据包。 要读取传入的数据包,我会这样做:

struct SomeRandomStruct
{
    int nVal1;
    int nVal2;
};

SomeRandomStruct* pStruct = reinterpret_cast<SomeRandomStruct*>(pBuffer);

现在有个小问题。假设我有一个这样的结构

struct SomeNewStruct
{
    int nNameLen;
    int nPassLen;
    char szName[];
    char szPass[];
};

由于 szName 和 szPass 的大小/长度是在同一个数据包中发送的,有没有办法在 reinterpret_cast 中设置它的大小,或者我是否必须手动读取数据包?

最佳答案

友情提示:

停止!

考虑像 google protocol buffers 这样的东西,以跨平台和安全的方式为您编码消息。

原因如下:

  1. int 有多大?在你的机器上?今天?明天?它在 c++ 标准中未定义。

  2. int 的二进制表示是什么?机器发送和机器接收是否相同?会一直这样吗? (如果您认为"is",那么您就错了)。同样,C++ 标准对此事无话可说。

  3. 结构中数据成员之间的填充是什么?所有主机上的所有编译器都一样吗? (回答:没有)

  4. 问问自己为什么像 htons() 这样的函数存在。它们存在是因为并非所有机器都相同,但它们之间的通信必须相同。

我可以继续......

关于c++ - 数据包转换为具有多个动态数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27907658/

相关文章:

c++ - 将 emplace_back 对象放入 std::list 的正确方法

c# - 如何在 C# 中实现 C++ 风格的函数指针?,不使用委托(delegate)

c - 为什么我们不能初始化结构体中的成员?

c - 通过 udp 套接字发送结构

c++ - 访问 union 成员需要类型转换吗?

c++ - 将 std::bind 函数指针转换为 void* 并返回

c++ - 我应该使用 std::shared 指针来传递指针吗?

c++ - 通过 C++ 类接口(interface)处理序列

c - 结构初始化错误

types - Swift:NSNumber 不是 UIViewAnimationCurve 的子类型