簡體   English   中英

write_some vs write - boost asio

[英]write_some vs write - boost asio

為什么有人想在不能將所有數據傳輸到對等write_some時使用write_some

來自boost write_some文檔

write_some操作可能不會將所有數據傳輸到對等方。 如果需要確保在阻塞操作完成之前寫入所有數據,請考慮使用write函數。

write_some方法有write方法時,它與boost的相關性是什么? 我查看了boost write_some文檔,我無法猜到。

在一個極端, write等待,直到所有數據都被確認為寫入遠程系統。 它以最慢的成本為代價,最有把握地成功完成。

在相反的極端,您可以將數據排隊等待寫入並立即返回。 這很快,但根本不能確保數據實際寫入。 如果路由器出現故障,DNS提供了錯誤的地址等,您可能會嘗試發送到某些不可用的機器(可能)已經很長時間沒有。

write_some是這兩個極端之間的中間點。 它至少在寫入一些數據后才會返回,因此它可以確保您嘗試寫入的遠程主機當前存在(對於某些,可能相當寬松的“當前”定義)。 它並不能保證所有數據都會被寫入,但可能會更快完成,並且仍然會給出一點“溫暖模糊”的感覺,即寫入很可能完成。

至於何時你可能想要使用它:顯而易見的情況就像通過家用計算機上的本地連接進行大量傳輸。 這里可能存在的問題不是硬件,而是計算機(或路由器)配置錯誤。 只要一個字節經過,您就可以確信連接配置正確,並且傳輸可能會完成。 由於轉移很大,您可能會節省大量時間作為回報,以最大限度地減少成功完成的保證。

至於何時你想避免它:幾乎扭轉了上述情況。 您正在通過(例如)不可靠的Internet連接發送少量數據。 由於您只發送一些數據,因此在發送所有數據之前返回不會節省太多時間。 連接不夠可靠,傳輸數據包的幾率實際上與其他數據包的幾率無關 - 也就是說,發送一個數據包幾乎不能告訴你發送下一個數據包的可能性。

真的沒有理由。 但這些功能處於不同的水平。

  • basic_stream_socket::write_some是套接字上的一個操作,它幾乎包含了操作系統的send操作(大多數send實現不保證完整消息的傳輸)。 通常,您將此調用包裝在一個循環中,直到發送完所有數據。
  • asio::write是一個高級包裝器,它將循環直到發送所有數據。 它接受一個套接字作為參數。

使用write_some一個可能原因可能是移植基於套接字並且已經進行循環的現有代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM