我的程序使用UDP在两个程序之间发送数据,它工作得很好但是我在我要发送的数据中添加了一个新的矢量,矢量类型是另一个看起来像这样的类......
class Bullet: public Sprite
{
public:
float speed;
};
DataPacket ......
typedef struct DataPacket
{
int ID; //Player ID
int elapsedTime; //Total elapsed player time
float x, y; //X & Y pos of player
std::vector<Bullet>* pBullets; //Vector containing all the players bullets
};
有没有办法正确发送这些数据?一旦服务器从客户端接收数据,表达式就无法评估,每个其他部分在接收到的数据包中都是正确的。
服务器基本上是在屏幕上接收子弹的位置数据,这些数据包含在此Bullet类中以及其他一些项目中。
请注意:pBullet从来不是一个指针但是试图找出错误的地方我把它改成指针......它从来没有解决过这个问题
答案 0 :(得分:3)
你不能这样做。向量是一个类,通常使用指向动态内存的内部指针实现,该向量随着向量的增长而改变位置。
当您尝试通过强制转换整个结构来序列化向量时,您只需将指针序列化为包含向量内容的内存,您不会获取内容本身,因为它不是该结构的一部分。
您必须逐个单独序列化矢量中的所有项目,并在反序列化时单独添加它们。
请注意,您可以将项目符号的向量更改为结构内部的静态大小的数组,然后它将在内存中连续,您可以只序列化整个结构 - 您还可以将数组的最后一个元素设置为一个项目符号的数组,然后为结构大小+(x-1)* sizeof(项目符号)分配内存,允许您为所添加的所有额外内存覆盖1的数组。这在内存中也是连续的,允许您非常容易地序列化整个内存区域。
你还应该查看htonl,ntohl,htons,ntohs并开始对数据进行网络字节排序,如果你要通过网络发送它来保持字节字节序不成为其他一些问题您可能最终使用的系统。
答案 1 :(得分:1)
每当必须通过网络发送数据时,请使用序列化。您可以参考Boost Serialization。 您的DataPacket的大小是动态的。如果它是一个数组而不是向量,它可能在机器具有相同的字节序时起作用。
答案 2 :(得分:1)
对于游戏开发,我建议使用Google ProtoBuf。与Boost Serialization相比,它提供了二进制序列化(Boost Serialization有一个二进制序列化的例子,但它不是非常便携),并且对于复杂的数据结构更方便。
答案 3 :(得分:0)
您需要自己序列化数据。你不能只发送std::vector
或指针。