1. 程式人生 > >阻塞read/write型socket網路連線弊端——緩衝區堆積——linux網路程式設計學習

阻塞read/write型socket網路連線弊端——緩衝區堆積——linux網路程式設計學習

情景:

自定義協議:有頭無尾,資料中可計算長度。

採用阻塞read/write傳送接收。

測試程式碼:

接收端主要部分截圖,在read()之間加sleep即可:

注意事項:如果雙工,接收端傳送反饋的write最好別再sleep之後,不然有干擾。(好像是共用緩衝區,暫時不測)

傳送端主要部分截圖,write()之間間隔小於read()即可:

實測結果:

152是4個38

遇到問題:

當傳送快於接收,緩衝區堆積,一次read多個自定義協議包。字串處理肯定就粘連了,但此處是自定義協議,所以能夠精確找到資料並讀取。

但是多接收的資料就浪費了,如果比較關鍵就麻煩了。

解決方法:

對比read返回值與資料包長度,長度不等則額外處理。

其他方法:換機制等,select,epoll

警示:

不要輕易利用read()返回值確定位置,能計算協議包長度最好和read()返回值對比,提早發現可能的漏洞