数据包转换为具有多个动态数组的struct

时间:2015-01-12 17:35:02

标签: 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&amp;的大小/长度szPass是在同一个数据包中发送的,有没有办法可以在reinterpret_cast中设置它的大小,还是我必须手动读取数据包?

2 个答案:

答案 0 :(得分:1)

友情警告:

停止!

考虑像谷歌协议缓冲区这样的东西,以跨平台和安全的方式为您编码消息。

以下是一些原因:

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

  2. int的二进制表示形式是什么?机器发送和机器接收是否相同?会永远吗? (如果你认为'是'那么你错了)。再一次,c ++标准对此事无话可说。

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

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

  5. 我可以继续...

答案 1 :(得分:0)

由于您的问题标记为C ++,我建议您在构造函数中进行动态分配,并在析构函数中进行释放。这样,您可以在结构中使用简单的指针:

struct struct SomeNewStruct {
    int nNameLen;
    int nPassLen;
    char *szName;
    char *szPass;

    SomeNewStruct(int nameLen , int passLen) {
        // set and alloc... 
    }
    SomeNewStruct(SomeNewStruct &src) {
        // alloc and copy
    }
    ~SomeNewStruct() {
        // dealloc ... 
    }
}

你甚至可以使用std::string代表szName和SzPass让STL处理那些低级别的分配细节:

struct struct SomeNewStruct {
    int nNameLen;
    int nPassLen;
    std::string szName;
    std::string szPass;
}