Э
Size: a a a
Э
Э
Э
n
async fn parse_line(socket: &TcpStream) -> Result<String, Error> {
let len = socket.read_u32().await?; (1)
let mut line = vec![0; len];
socket.read_exact(&mut line).await?; (2)
let line = str::from_utf8(line)?;
Ok(line)
}
В (2) считается же тот объём данных, что был доступен в (1), почему разрыв в строке получается? Много данных за раз считывается?Э
(1) вызывается два раза подряд из-за кенсела первой футуры, но твой код ожидает, что каждый вызов (1) будет в паре с вызовом (2).Э
n
TK
Э
await у тебя может эта херня запаниковать, а потом закетчиться (ну, собственно, кенсел футуры так примерно и делает).Э
Э
await надо смотреть как на херню, у которой внутри panic при кенселе вызывается, а на любой селект надо смотреть как на catch_unwind, который ловит эти паники после кенсела.TK
Э
Э
TpcStream, на который мы вызвали read_u32 два раза подряд.TK
Э
fn parse_line(socket: &TcpStream, cancel_flag: Cell<bool>) -> Result<String, Error> {
let len = if cancel_flag.get() { panic!() } else { socket.read_u32()? }; // (1)
let mut line = vec![0; len];
if cancel_flag.get() { panic!() } else { socket.read_exact(&mut line)? }; // (2)
let line = str::from_utf8(line)?;
Ok(line)
}Э
cancel_flag.set(true) после того как поймает первый результат, а остальные ловит через catch_unwind.TK
Э
Э