我目前正在开发一个客户端/服务器应用程序,通过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中设置它的大小,还是我必须手动读取数据包?
答案 0 :(得分:1)
友情警告:
停止!
考虑像谷歌协议缓冲区这样的东西,以跨平台和安全的方式为您编码消息。
以下是一些原因:
int有多大?在你的机器上?今天?明天?它在c ++标准中未定义。
int的二进制表示形式是什么?机器发送和机器接收是否相同?会永远吗? (如果你认为'是'那么你错了)。再一次,c ++标准对此事无话可说。
结构中数据成员之间的填充是什么?所有主机上的所有编译器都一样吗? (回答:否)
问问自己为什么会出现像htons()
这样的函数。它们在那里是因为并非所有的机器都是相同的,但它们之间的通信必须是。
我可以继续...
答案 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;
}