簡體   English   中英

通過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()的返回值。 僅僅因為您要求發送sizeof(Client)字節,您絕對不能保證此請求將成功或寫入許多字節。

recv ()也是如此。 您必須始終檢查每個系統調用的返回值,並准備好處理錯誤和每個可能的返回值,除非外部情況(很少有這種情況)保證系統調用永遠不會失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM