我正在尝试从UnixStream
(在此代码中称为socket
)读取一些大小未知的数据。数据由6个字节的标头组成,最后两个字节指示消息的其余部分应保留多长时间。
我正在调用的.into_buf()
方法来自Tokio的.into_buf()
板条箱中的IntoBuf
特性。
bytes
我遇到的问题是let mut header = [0u8; 6];
let response1 = self.socket.read(&mut header);
let mut cursor = header.into_buf();
let evt_code = cursor.get_u16_le();
let controller = cursor.get_u16_le();
let param_size = cursor.get_u16_le() as usize;
let mut param = vec![0u8; param_size];
let response2 = self.socket.read(&mut param);
let mut cursor = param.into_buf();
始终是response2
E_WOULDBLOCK,因为我的Err
已连接到非阻塞套接字。似乎对UnixStream
的第一次调用按预期读取了6个字节,但随后仅丢弃了流中的其余内容。
我该如何解决/如何使read()
在流中保留多余的数据?
似乎最简单的解决方案是将我的初始缓冲区变大,然后立即读取所有内容,但是问题是,我可能收到的最大消息超过64KB。为每次读取分配或重新清零64KB缓冲区似乎很浪费,尤其是因为大多数消息都比这小得多。
我已经通过使用原始文件描述符而不是read()
并用UnixStream
调用recv()
来解决此问题。
MSG_PEEK