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

时间:2016-01-27 03:31:43

标签: c++ 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] - &gt; m_bIsAlive = 205?

1 个答案:

答案 0 :(得分:1)

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()。您必须始终检查每次系统调用的返回值,准备好处理错误和每个可能的返回值,除非外部情况(这种情况很少)保证系统调用永远不会失败。