tokio を使用してソケットからデータを読み取ろうとしています。データは Picamera から送信されたバイトで、コードから読み取ってファイルに書き込みます。ファイルを実行すると、途中でいくつかのフラグメントが失われているようです。上記のコードは次のとおりです。
let listener = TcpListener::bind("0.0.0.0:8080").await?;
println!("Server started listening");
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buf = [0; 1024];
let f = File::create("./test.h264").expect("Unable to create file");
let mut f = BufWriter::new(f);
// In a loop, read data from the socket and write the data back.
loop {
let n = match socket.read(&mut buf).await {
// socket closed
Ok(n) if n == 0 => return,
Ok(n) => {
f.write_all(&buf[0..n]).expect("Write failed");
n
},
Err(e) => {
eprintln!("failed to read from socket; err = {:?}", e);
return;
}
};
// Write the data back
// if let Err(e) = socket.write_all(&buf[0..n]).await {
// eprintln!("failed to write to socket; err = {:?}", e);
// return;
// }
}
});
}
何が起こっているのか理解できません。サイズ 1024 のバガーを指定したと思います。ファイルへの書き込み中に 1024 を読み取ると、再度読み取りを開始する前にいくつかのパケットが失われます。私は間違っているかもしれません。pi からキャプチャした一定のビデオ ストリームを維持したいと考えています。事前に助けてくれてありがとう。