如何一次从连接到套接字的UnixStream读取一点?

问题描述 投票:1回答:1

我正在尝试从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缓冲区似乎很浪费,尤其是因为大多数消息都比这小得多。

linux sockets unix rust
1个回答
0
投票

我已经通过使用原始文件描述符而不是read()并用UnixStream调用recv()来解决此问题。

MSG_PEEK
© www.soinside.com 2019 - 2024. All rights reserved.