我試圖通過winsock UDP套接字從客戶端發送一個結構到服務器,但我沒有收到已發送的相同字節,或者至少不是正確地重組結構。C++ Winsock結構發送/ recv
struct Header
{
uint16_t sender;
uint16_t number;
uint16_t packetSize;
uint16_t type;
};
發送的結構:
Header header;
header.sender = 1;
header.number = 2;
header.packetSize = 3;
header.type = 4;
char buffer[sizeof(Header)];
memcpy(buffer, &header, sizeof(Header));
int bytesSent = sendto(sendSocket_, data, sizeof(Header), 0, (const sockaddr*)&sendSocketAddr_, sizeof(sendSocketAddr_));
if (bytesSent > 0)
{
cout << bytesSent << endl;
}
接收結構:
char *data = new char[sizeof(Header)];
int bytesRecv = recv(listenSocket_, data, sizeof(Header), 0);
if (bytesRecv > 0)
{
cout << bytesRecv << endl;
Header header;
memcpy(&header, data, sizeof(data));
cout << header.sender << ": " << header.number << ": " << header.packetSize << ": " << header.type << endl;
}
字節相同量的被接收爲被髮送,然而一旦複製回上唯一的服務器側的新結構前兩個值是正確的,其餘的不是。
在這種情況下,結構包含1,2,52428,52428時收到。
在發送/接收過程中是否有錯誤,或者是在另一端創建結構?
客戶端和服務器是否使用相同的選項使用相同的編譯器編譯?如果不是,則結構中字段的對齊可能不同。 – Eelke 2015-02-23 07:49:45
是的,客戶端和服務器都使用相同的編譯器使用相同的選項進行編譯。 – bic 2015-02-23 07:53:38
我不確定爲緩衝區數組分配了正確的大小。你應該在memcpy中使用'sizeof(header)'(變量的大小,而不是類型)。在發送之前打印緩衝區的內容以確保您發送的內容是正確的。 – 2015-02-23 08:07:08