我目前正在使用客户端/服务器应用程序,通过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/