[英]Typecasting a character buffer to a struct coming from a socket
我正在使用以下代碼從套接字讀取數據:
while (true)
{
int len = 0;
ioctl(sd, FIONREAD, &len);
if (len > 0)
{
len = read(sd, databuf, len);
}
else
std::cout << "error" << std::endl;
}
套接字有大量的結構。 結構的大小是我定義的。
所以我怎么能讀一個像這樣的結構:
typedef struct
{
short msglen;
short id;
int seqno;
}HEADER;
我曾想過要進行類型轉換,但是我不知道該怎么做。 字符緩沖區將一個接一個地包含多個結構。 我只需要讀取前8個字節即可獲取第一個字節。
另外,還有一個while循環,因為我正在從網絡接收連續的多播消息流。
std::memcpy(&header, buffer, sizeof(header));
符合標准且安全的方法是使用memcpy
:
HEADER header;
char buffer[/*size*/];
/* read data into buffer */
std::memcpy(&header, buffer, sizeof(header));
現代編譯器完全有能力優化掉函數調用。
不要嘗試使用reinterpret_cast
類的內容來轉換buffer
。 這是未定義的行為,因為它違反了嚴格的別名規則(您可以通過char
的glvalue或unsigned char
類型訪問任何類型的對象的存儲值,但相反情況並不成立)。
另外,請輸入typedef struct { /* ... */ } HEADER;
是一個C主義。 只需執行struct HEADER { /* ... */ };
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.