Я пытаюсь прочитать некоторые данные неизвестного размера из UnixStream
(в этом коде они называются socket
).Данные состоят из заголовка из 6 байтов, а последние два байта указывают, как долго должна быть оставшаяся часть сообщения.
Метод .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
всегда является Err
E_WOULDBLOCK, потому что мой UnixStream
подключен к неблокирующему сокету,Кажется, что первый вызов read()
читает 6 байтов, как и предполагалось, но затем просто отбрасывает остальное содержимое в потоке.
Как мне обойти это / как я могу сделать read()
оставить дополнительные данные в потоке?
Кажется, простейшим решением было бы просто увеличить размер моего исходного буфера, а затем просто прочитать все сразу, но проблема в том, что самое большое возможное сообщение, которое я мог получить, составляет чуть более 64 КБ.Выделение или повторное обнуление буфера 64 КБ для каждого чтения кажется довольно расточительным, особенно потому, что большинство сообщений намного меньше этого
.