簡體   English   中英

將字符緩沖區類型轉換為來自套接字的結構

[英]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.

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