C++ 键入要通过winsock发送的结构数组(指针?)

C++ 键入要通过winsock发送的结构数组(指针?),c++,arrays,pointers,casting,C++,Arrays,Pointers,Casting,我仍然在思考指针之类的东西,所以这里是 每个客户端都会将播放机的位置正确地发送到服务器 在服务器上,数据然后被放入一个结构数组(或指向结构?)。该阵列的数据也经验证是正确的 然后,服务器将把该数组中的所有数据发送回每个玩家 我希望能够将数组从服务器发送到客户机(然后再发送回来),因为我想在头脑中采用的是我理解的某种方法(或者指向结构的指针数组?),例如子弹数组和射击数组,或者其他东西 我现在不担心带宽或最佳代码,这将在我更好地理解它之后出现:) 基本上我已经为我的播放器创建了一个结构:- s

我仍然在思考指针之类的东西,所以这里是

  • 每个客户端都会将播放机的位置正确地发送到服务器
  • 在服务器上,数据然后被放入一个结构数组(或指向结构?)。该阵列的数据也经验证是正确的
  • 然后,服务器将把该数组中的所有数据发送回每个玩家
  • 我希望能够将数组从服务器发送到客户机(然后再发送回来),因为我想在头脑中采用的是我理解的某种方法(或者指向结构的指针数组?),例如子弹数组和射击数组,或者其他东西
  • 我现在不担心带宽或最佳代码,这将在我更好地理解它之后出现:)
基本上我已经为我的播放器创建了一个结构:-

struct PlayerShip
{
    unsigned int health;
    unsigned int X;
    unsigned int Y;
};
然后我(在朋友的指导下)创建了一个数组,允许我访问这些结构的数据(并根据需要键入)(我想)

PlayerShip*playerray[serverMaxClients];
对于(int i=0;i
我从所有连接的播放器中接收数据并将其输入阵列

for (int slotIndex = 0; slotIndex < serverMaxClients; slotIndex++)
{
    char szIncoming[1500];
    ZeroMemory(szIncoming,1500);
    int connectionStatus = recv(clientSocketArray[slotIndex], (char*)szIncoming,sizeof(szIncoming),0);

    playerDataTemp = (PlayerShip*)szIncoming;
    playerArray[slotIndex]->X = playerDataTemp->X;
    playerArray[slotIndex]->Y = playerDataTemp->Y;
}
for(int-slotIndex=0;slotIndexX=playerDataTemp->X;
playerArray[slotIndex]>Y=playerDataTemp->Y;
}
我打印出数组,所有数据都是正确的

因此,下一步是将数据发送回客户端

我尝试了下面的方法和它的一些变体,但是当我试图将变量更改为引用和/或指针时(我仍然没有看到指针和引用突然变得有意义的顿悟时刻),我或者得到了编译错误,或者值出现错误。(以下情况当前输出的值不正确)

for(int i=0;iserverMaxClients
指针数组,每个指针指向一个
PlayerShip
结构

这里

您指的是这个指针数组的地址,因此对
send
的调用将发送一组指针,这几乎肯定不是您想要的

delete outgoing;
您试图删除这个指针数组,它是在堆栈上分配的,而不是从堆中分配的,因此这可能会导致重大问题;此外,您在每次迭代中都删除相同的指针

我认为以下内容更接近于您打算做的事情:

     for (int i = 0; i < serverMaxClients; i++)
     {
         char* outgoing = (char*)playerArray [i];

         if (clientSlotTaken[i] == true)
         {
              send(clientSocketArray[i],outgoing,sizeof(PlayerShip),0);
         }

         int *valueCheck;
         valueCheck = (int*)outgoing;
         cout << "VALUE CHECK " << *valueCheck << "\n";

         delete outgoing;
     }
但我认为您正试图避免这种情况,因为它可能会降低I/O的效率

2) 您可以执行更新中尝试执行的操作。要解决列出的错误并使其正常工作,请执行以下操作:

a) 您需要将char*转换为PlayerShip*,就像您在早期代码中必须以另一种方式转换一样

b) 在复制作业中,左侧有一个PlayerShip,但右侧有一个PlayerShip*,您需要取消对该指针的引用

c) 使用固定长度(如120)是非常危险的;如果以后有更多客户端,则可能会溢出;大小应为serverMaxClients*sizeof(PlayerShip)

d) “&outing[0]”与“outing”同义

综上所述:

    char outgoing[serverMaxClients * sizeof (PlayerShip)];
    PlayerShip *dataPopulator;
    dataPopulator = (PlayerShip*) outgoing;  //Start at the begining of the array

    for (int i=0; i < serverMaxClients; i++)
    {
        *dataPopulator = *playerArray[i];
        dataPopulator++;
    }
b) 在堆栈上:

PlayerShip playerShips [serverMaxClients];
ZeroMemory (playerShips,sizeof(playerShips));
(a)中的ZeroMemory调用也可以在b)中工作,但反过来不行。)

现在,独立于如何分配连续阵列,您可以像这样将整个数据写入每个客户端:

 for (int i = 0; i < serverMaxClients; i++)
     if (clientSlotTaken[i] == true)
          send(clientSocketArray[i],(char *) playerShips,serverMaxClients * sizeof(PlayerShip),0);
for(int i=0;i
(同样,在案例b中)您可以用sizeof(玩家)替换大小计算


我希望这能进一步澄清问题——但如果您仍然感到困惑,请随时询问有关指针的更一般性问题:-)

刚刚测试了您的更改,如果我理解正确,服务器一次只通过Send()发回一个playerShip struct命令。我希望能够将整个阵列发送回每个客户端。上面的for循环应将阵列发送到每个连接的客户端。ValueChecked已工作,谢谢:)在这种情况下,您需要使用
send(clientSocketArray,outgoing,sizeof(PlayerShip)*serverMaxClients,0)
,我相信。但这让我们回到了第一步,将发送的数据将是结构的地址:(我更新了我的答案,因为我的回答不适合评论。感谢您的深入回答:)最后我做了一些类似于你最后所做的事情,但我还没有回顾我的代码,可能会让它变得更整洁,并理解它是如何工作的。在接下来的几天里,我将这样做,干杯!
delete outgoing;
     for (int i = 0; i < serverMaxClients; i++)
     {
         char* outgoing = (char*)playerArray [i];

         if (clientSlotTaken[i] == true)
         {
              send(clientSocketArray[i],outgoing,sizeof(PlayerShip),0);
         }

         int *valueCheck;
         valueCheck = (int*)outgoing;
         cout << "VALUE CHECK " << *valueCheck << "\n";

         delete outgoing;
     }
    if (clientSlotTaken[i] == true)
    {
        for (int j = 0;j < serverMaxClients;j++)
            send(clientSocketArray[i],(char*)playerArray [j],sizeof(PlayerShip),0);
    }
    char outgoing[serverMaxClients * sizeof (PlayerShip)];
    PlayerShip *dataPopulator;
    dataPopulator = (PlayerShip*) outgoing;  //Start at the begining of the array

    for (int i=0; i < serverMaxClients; i++)
    {
        *dataPopulator = *playerArray[i];
        dataPopulator++;
    }
PlayerShip *playerShips = new PlayerShip [serverMaxClients];
ZeroMemory (playerShips,serverMaxClients * sizeof(PlayerShip));
PlayerShip playerShips [serverMaxClients];
ZeroMemory (playerShips,sizeof(playerShips));
 for (int i = 0; i < serverMaxClients; i++)
     if (clientSlotTaken[i] == true)
          send(clientSocketArray[i],(char *) playerShips,serverMaxClients * sizeof(PlayerShip),0);