gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:32:44 25 4
gpt4 key购买 nike

我要发送的结构:

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() 的返回值。仅仅因为您要求发送 sizeof(Client) 字节,您绝对不能保证此请求会成功,或者会写入多少字节。

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

关于c++ - 通过 Winsock 在 C++ 中发送/接收结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35028365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com