我目前正在使用客户端/服务器应用程序,通过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协议缓冲区的工具,以跨平台和安全的方式为您编码消息。

原因如下:


一个int有多大?在您的机器上?今天?明天?在c ++标准中未定义。
int的二进制表示形式是什么?发送机器和接收机器是否相同?会永远吗? (如果您认为“是”,那么您错了)。同样,C ++标准对此无话可说。
结构中数据成员之间的填充是什么?所有主机上的所有编译器都一样吗? (答案:否)
问问自己为什么存在htons()之类的功能。它们之所以存在,是因为并非所有机器都相同,但是它们之间的通信必须相同。


我可以继续...

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

10-15 00:45
查看更多