我使用以下代码从套接字读取数据:
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
。这是未定义的行为,因为它违反了严格的别名规则(您可以通过 char
或 unsigned char
类型的泛左值访问任何类型的对象的存储值,但反之亦然不成立)。
顺便说一句,typedef struct {/* ... */} HEADER;
是一种 C 主义。只需执行 struct HEADER {/* ... */};
。
关于c++ - 将字符缓冲区类型转换为来自套接字的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24730323/