c++ - 将字符缓冲区类型转换为来自套接字的结构

标签 c++ c linux sockets networking

我使用以下代码从套接字读取数据:

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 循环,因为我正在从网络接收连续的多播消息流。

最佳答案

符合标准且安全的方法是使用memcpy:

HEADER header;
char buffer[/*size*/]; 

/* read data into buffer */

std::memcpy(&header, buffer, sizeof(header));

现代编译器完全有能力优化函数调用。

不要尝试使用reinterpret_cast之类的东西来转换buffer。这是未定义的行为,因为它违反了严格的别名规则(您可以通过 charunsigned char 类型的泛左值访问任何类型的对象的存储值,但反之亦然不成立)。

顺便说一句,typedef struct {/* ... */} HEADER; 是一种 C 主义。只需执行 struct HEADER {/* ... */};

关于c++ - 将字符缓冲区类型转换为来自套接字的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24730323/

相关文章:

c++ - 在多线程上下文中卸载 Mono 域

c++ - 以对数递增计算嵌套循环的时间复杂度

c++ - Protocol Buffer : RepeatedField unique elements

linux - 用于比较远程目录的 Shell 脚本

c++ - 使用斐波那契数列的递归函数

c++ - 我怎样才能去除这张图片中的噪音-openCV

c++ - srand(1) 和 srand(0) 有什么区别

c - 从文件中读取两个数组

linux - 有没有办法在Linux中动态更改主机名到IP地址的映射(无需重新启动)?

linux - 如何从 'git log' check out Git 中的特定版本?