这就是
我到目前为止所做的一切:
struct HeadPacket
{
int type;
};
struct ReceivePacket
{
// Header
HeadPacket Head;
// Raw Data
char* buffer;
};
struct MovePacket
{
// Header
HeadPacket Head;
// Raw Data
float X;
float Y;
};
struct ClientsPacket
{
// Header
HeadPacket Head;
// Raw Data
int Clients;
float* X;
float* Y;
};
这些是我拥有的一些示例数据包。
首先,我创建一个数据包,将其转换为 char* 并发送。
MovePacket m;
m.Head.type = 2;
m.X = X;
m.Y = Y;
this->Socket->Send(this->Socket->GetAddress(), (char*)&m, sizeof(m));
在另一边,我收到它:
char packet[256]; //max size of a packet
SOCKADDR_IN server;
this->Socket->Receive(packet, 256, &server);
现在我将其转换为数据包以读取类型,然后进一步将其转换为
ReceivePacket* rec = (ReceivePacket*)packet;
switch (rec->Head.type)
{
case 0:
{
MovePacket* move = (MovePacket*)rec;
}
break;
case 1:
{
ClientsPacket* c = (ClientsPacket*)rec;
}
break;
}
如果我发送和接收MovePacket,一切正常。
但是,如果我发送一个具有浮点数组的 ClientsPacket,则浮点数组永远不会包含正确的值。
ClientsPacket c;
c.Head.type = 3;
c.Clients = clients.size();
c.Y = new float[clients.size()];
c.X = new float[clients.size()];
int size = sizeof(c.Head) + sizeof(int)+((sizeof(float)*clients.size()) * 2);
for (unsigned int i = 0; i < clients.size(); i++)
{
c.X[i] = clients[i].X;
c.Y[i] = clients[i].Y;
printf("X: %f Y: %fn", c.Y[i], c.X[i]);
}
rc = sock.Send(newclient.GetAddr(), (char*)&c, size);
您知道如何解决它以及我可以在哪里进一步阅读它为什么会发生,或者您能向我解释为什么会发生吗?
它
应该是什么样子:服务器:
ClientsPacket c;
c.Head.type = 3;
c.Clients = clients.size();
c.X = new float[clients.size()];
c.Y = new float[clients.size()];
//define sizes
int fsize = (sizeof(float)*clients.size());
int hsize = sizeof(c.Head) + sizeof(c.Clients);
int size = hsize + sizeof(float)+(fsize*2);
//define sendchar
char* buffer = new char[size];
//fill arrays
for (unsigned int i = 0; i < clients.size(); i++)
{
c.X[i] = clients[i].X;
c.Y[i] = clients[i].Y;
printf("X: %f Y: %fn", c.X[i], c.Y[i]);
}
//copy memory from client
memcpy(buffer, &c, hsize);
memcpy(buffer + hsize, c.X, fsize);
memcpy(buffer + hsize + fsize, c.Y, fsize);
客户:
ClientsReceivePacket* cv = (ClientsReceivePacket*)rec;
ClientsPacket c;
memcpy(&c.Head, packet, sizeof(c.Head));
memcpy(&c.Clients, packet + sizeof(c.Head), sizeof(c.Clients));
c.X = new float[cv->Clients];
c.Y = new float[cv->Clients];
//define sizes
int hsize = sizeof(c.Head) + sizeof(c.Clients);
int fsize = (sizeof(float)*c.Clients);
//copy content into float array
memcpy(c.X, packet + hsize, fsize);
memcpy(c.Y, packet + hsize + fsize, fsize);