通过 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 值,除非外部环境(很少有这种情况)保证系统调用永远不会失败.
我要发送的结构:
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 值,除非外部环境(很少有这种情况)保证系统调用永远不会失败.