【網路程式設計】阻塞IO程式設計的坑
echo服務阻塞
假設這樣一個簡單的echo場景:客戶端向服務端傳送20M的資料,傳送完之後接收資料,而服務端每次接收4k資料,接受完全部資料之後進行回顯。這樣的客戶端和服務端程式啟動之後,會意外的阻塞。阻塞的點在哪裡呢
因為客戶端傳送完資料之後才會進行接收資料,而服務端接收到了4k資料之後就會進行回顯,這時服務端傳送到客戶端的核心緩衝區中,注意這時客戶端並沒有讀取資料,所以客戶端的接收緩衝區中的資料一直積累,直到積累到某個閾值,此時服務端的tcp advertised window大小為0,tcp不能傳送資料,結果就是服務端阻塞在傳送。此時客戶端仍然在一直的傳送資料,但這個時候服務端是沒有進行讀取資料的,直到服務端的緩衝區也滿,最後客戶端也阻塞在傳送。導致雙方都阻塞在傳送資料。
那麼怎樣解決這個問題呢。其實只要服務端每次把資料全部讀取進來,然後進行傳送即可。全部讀取之後,客戶就開始接收資料,此時服務端傳送資料就不會造成客戶端的緩衝區滿,服務端也就不會阻塞在傳送資料。
相關文章
- IO multiplexing 與 非阻塞網路程式設計程式設計
- 玩轉 PHP 網路程式設計全套阻塞與非阻塞 IOPHP程式設計
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- IO模式設定網路程式設計常見問題總結—IO模式設定,阻塞與非阻塞模式程式設計
- 一文徹底搞定(阻塞/非阻塞/同步/非同步)網路IO、併發程式設計模型、非同步程式設計模型的愛恨情仇非同步程式設計模型
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- python 網路程式設計----非阻塞或非同步程式設計Python程式設計非同步
- 網路程式設計之IO模型程式設計模型
- IO程式設計和NIO程式設計簡介程式設計
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- 網路程式設計框架t-io的程式設計基本知識介紹程式設計框架
- IO和socket程式設計程式設計
- Linux核心程式設計(阻塞程式)(轉)Linux程式設計
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 阻塞/非阻塞讀寫總結、tcp網路程式設計的本質、muduo::Buffer設計簡介TCP程式設計
- Linux網路程式設計之IO模型Linux程式設計模型
- Linux核心模組程式設計--阻塞程式(轉)Linux程式設計
- 網路通訊程式設計程式設計
- 網路協程程式設計程式設計
- Socket 程式設計 (網路篇)程式設計
- py網路工具程式設計程式設計
- NIO非阻塞程式設計小案例程式設計
- Socket 程式設計IO Multiplexing程式設計
- Java網路程式設計和NIO詳解3:IO模型與Java網路程式設計模型Java程式設計模型
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- 程式設計師,請你不要在坑程式設計師了?程式設計師
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- Java併發程式設計:阻塞佇列Java程式設計佇列
- Java併發程式設計——阻塞佇列Java程式設計佇列
- Python網路Socket程式設計Python程式設計
- PHP併發IO程式設計之路PHP程式設計
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- 程式設計和網路程式設計入門程式設計
- 不會填坑的程式設計師不是一個好程式設計師!程式設計師
- 深圳IO:Shenzhen IO for Mac(燒腦程式設計遊戲)Mac程式設計遊戲
- 程式設計路漫漫程式設計
- python網路程式設計——IO多路複用之epollPython程式設計