我正在嘗試在 rust中實作FastCGI協議。當我遇到問題時,我在 stackoverflow 上問了一個問題(問題是這個)。正如你所看到的,我的問題的答案是這樣的:
然后使用read_exact讀取回應的標頭,提取其內容長度并再次使用 read_exact 獲取回應的內容:
我真的沒有問題。但從那以后,我遇到過一些人(無論是在網上還是在現實生活中),他們的說法與此非常相似:):
避免使用“精確”功能,因為它們可能會默默吞下一些流內容,請參閱檔案。
所以我的問題是。我應該read_exact用于我的具體情況嗎?說不要用的人read_exact對嗎?我為什么要占據它,或者為什么我不應該占據它?如果您特別需要有關我的案例的更多背景資訊,我在本文開頭提出的所有問題都在我的問題中
uj5u.com熱心網友回復:
你確定那些不鼓勵使用的read_exact人指的是 Rust 嗎?在搜索這個時,我只能找到談論其他語言的人。
使用應該沒問題read_exact。
首先,我們可以看到它永遠不會讀取超過檔案中所需的位元組數:
如果此函式回傳錯誤,則未指定它已讀取多少位元組,但它永遠不會讀取超過完全填滿緩沖區所需的位元組數。
我們丟失的唯一資訊read_exact是我們在遇到錯誤和任何ErrorKind::Interrupted錯誤時讀取的確切位元組數。但是,在閱讀中斷錯誤的檔案后,我們可以看到它的狀態如下。
此操作被中斷。
通常可以重試中斷的操作。
除非您明確使用某個庫,該庫宣告在中斷錯誤后繼續讀取之前需要執行一些額外操作,否則您可以假設可以重試此操作,直到讀取位元組或指示不再可能讀取的錯誤發生。如果您read_exact在通用std::io::Read輸入上使用,則可以安全地假設呼叫者已適當地處理了此用例。
您還可以通過閱讀read_exact. 我還沒有看到任何主要的庫選擇提供他們自己的實作read_exact,但理論上這是可能的。但是,他們仍應遵守read_exact得出與以前相同結論的檔案。
pub trait Read {
#[stable(feature = "read_exact", since = "1.6.0")]
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
default_read_exact(self, buf)
}
// etc...
}
pub(crate) fn default_read_exact<R: Read ?Sized>(this: &mut R, mut buf: &mut [u8]) -> Result<()> {
while !buf.is_empty() {
match this.read(buf) {
Ok(0) => break,
Ok(n) => {
let tmp = buf;
buf = &mut tmp[n..];
}
Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
Err(e) => return Err(e),
}
}
if !buf.is_empty() {
Err(error::const_io_error!(ErrorKind::UnexpectedEof, "failed to fill whole buffer"))
} else {
Ok(())
}
}
uj5u.com熱心網友回復:
我知道只有一種情況可能會丟失資料,那就是在開始讀取之后但在達到請求數量之前發生read_exact錯誤(除了)。Interrupted在這種情況下,在錯誤之前已經讀取的資料會丟失,但在大多數情況下,您無論如何都無法對該資料執行任何操作,因為它不完整,您只能自己處理錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520776.html
標籤:插座锈
上一篇:JetpackComposeAlignment-誤解了alignBy修飾符
下一篇:套接字程式獲得出生年份
