【網路程式設計】阻塞IO程式設計的坑

饅頭2870發表於2020-12-18

echo服務阻塞

  假設這樣一個簡單的echo場景:客戶端向服務端傳送20M的資料,傳送完之後接收資料,而服務端每次接收4k資料,接受完全部資料之後進行回顯。這樣的客戶端和服務端程式啟動之後,會意外的阻塞。阻塞的點在哪裡呢
  因為客戶端傳送完資料之後才會進行接收資料,而服務端接收到了4k資料之後就會進行回顯,這時服務端傳送到客戶端的核心緩衝區中,注意這時客戶端並沒有讀取資料,所以客戶端的接收緩衝區中的資料一直積累,直到積累到某個閾值,此時服務端的tcp advertised window大小為0,tcp不能傳送資料,結果就是服務端阻塞在傳送。此時客戶端仍然在一直的傳送資料,但這個時候服務端是沒有進行讀取資料的,直到服務端的緩衝區也滿,最後客戶端也阻塞在傳送。導致雙方都阻塞在傳送資料。
  那麼怎樣解決這個問題呢。其實只要服務端每次把資料全部讀取進來,然後進行傳送即可。全部讀取之後,客戶就開始接收資料,此時服務端傳送資料就不會造成客戶端的緩衝區滿,服務端也就不會阻塞在傳送資料。

相關文章