通过 Winsock 在 C++ 中发送/接收结构

Sending / Receiving a struct in C++ via Winsock

我要发送的结构:

struct Client
{
    SOCKET socket = 0;
    float m_fX = 0;
    float m_fY = 0;
    float m_fRot = 0;
    bool m_bIsAlive = false;
    Powerups m_ePowerup = Powerups::lazer;
};

客户端向服务器发送结构:

char* buffer = new char[sizeof(Client)];
memcpy(buffer, &dataToServer, sizeof(Client));
send(sock, (char*)dataToServer, sizeof(Client), NULL);

服务器从客户端接收结构:

char* buffer = new char[sizeof(Client)];
recv((SOCKET)socketData, buffer, sizeof(Client), NULL);
memcpy(m_pClients[i], (void*)buffer, sizeof(Client));

std::cout << "\tSocket: " << (int)(SOCKET)socketData << "\t" << m_pClients[i]->m_bIsAlive << std::endl;

为什么打印出来好像 m_pClients[i]->m_bIsAlive = 205?

char* buffer = new char[sizeof(Client)];
memcpy(buffer, &dataToServer, sizeof(Client));
send(sock, (char*)dataToServer, sizeof(Client), NULL);

在我看来,您的意思是将 send() 的第二个参数设置为 buffer。此外,如果 dataToServer 是指向 Client 结构的指针,则 memcpy() 的第二个参数不应是指向该指针的指针。

此外,您的代码也无法检查来自 send() 和 recv() 的 return 值。仅仅因为您要求发送 sizeof(Client) 字节,您绝对不能保证此请求会成功,或者会写入多少字节。

recv() 也是如此。您必须始终检查每个系统调用的 return 值,准备好处理错误和每个可能的 return 值,除非外部环境(很少有这种情况)保证系统调用永远不会失败.