1#pragma once
23 #include 4 #include 56
class
cyclebuffer722
23virtual ~cyclebuffer()
2430}31
32//
剩餘空間數
33int32_t space()
3437
38//
獲取buf的總大小
39int32_t capatity()
4043
44//
獲取有效資料長度
45int32_t size()
4649
50//
清空51
void
reset()
5257
58//
增加nsize個位元組
59int32_t grow(int32_t nsize)
6065
66 uint8_t *pmem = (uint8_t *)malloc(nsize +m_nbufsize);
67if(pmem ==null)
6871
72 int32_t nwriteindex = 0;73
//將舊記憶體中的資料拷貝到(增大的)新記憶體中
74do
7581 nwriteindex +=nreadbytes;
82 }while(m_ndatasize > 0
);83
84if(m_ndatasize > 0)85
8889
//釋放舊記憶體塊
90if(m_pbuf !=null)
9194
95 m_pbuf =pmem;
96 m_nreadindex = 0
;97 m_nwriteindex =nwriteindex;
98 m_ndatasize =nwriteindex;
99 m_nbufsize +=nsize;
100101
return
nsize;
102}
103104
//寫到寫列表的頭部---針對新資料
105 int32_t writetohead(const uint8_t *pbuf, int32_t ndatasize)
106111
112//
空間不夠
113if(m_ndatasize + ndatasize >m_nbufsize)
114119
}120
121if(m_nwriteindex 122126
else
if(m_nwriteindex ==m_nreadindex)
127130
else
131141
else
142147 memcpy(&m_pbuf[m_nreadindex-ndatasize], pbuf, ndatasize);
148 m_nreadindex -=ndatasize;
149}
150}
151152 m_ndatasize +=ndatasize;
153return
ndatasize;
154}
155156
//寫到列表的尾部
157 int32_t write(const uint8_t *pbuf, int32_t ndatasize)
158163
164if(ndatasize + m_ndatasize >m_nbufsize)
165170
}171
172if(m_nwriteindex 173177
else
178186
else
187191
}192 m_ndatasize +=ndatasize;
193return
ndatasize;
194}
195196
//讀取 讀列表的頭部記憶體
197 int32_t read(uint8_t *pbuf, const
int32_t nwantsize)
198203
204 int32_t ndatasize = ((m_ndatasize < nwantsize)?m_ndatasize : nwantsize);
205if(ndatasize<=0
)206
209210
if(m_nreadindex 211215
else
216224
else
225229
}230 m_ndatasize -=ndatasize;
231return
ndatasize;
232}
233234
235//
讀取資料但是不修改讀索引
236 int32_t peekread(uint8_t *pbuf, const
int32_t nwantsize)
237242
243 int32_t ndatasize = ((m_ndatasize < nwantsize) ?m_ndatasize : nwantsize);
244if(m_nreadindex 245248
else
if(m_nreadindex ==m_nwriteindex)
249252
else
253260
else
261264
}265
return
ndatasize;
266}
267268 };
js之網路訊息收發
包頭 public setsession userid number,sessionid number class packhead 分解包頭 public decode byte byte byte 接受訊息 連線到指定的主機和埠。連線成功派發 event.open 事件 連線失敗派發 event...
Linux網路(網路模型和收發流程)
為了解決網路互聯中異構裝置的相容性問題,並解耦複雜的網路包處理流程,國際標準化組織制定的開放式系統互聯通訊參考模型 open system interconnection reference model 簡稱為 osi 網路模型。osi 模型把網路互聯的框架分為應用層 表示層 會話層 傳輸層 網路層...
kernel筆記 網路收發包流程
本文將介紹網路連線建立的過程 收發包流程,以及其中應用層 tcp層 ip層 裝置層和驅動層各層發揮的作用。應用層 對於使用socket進行網路連線的伺服器端程式,我們會先呼叫socket函式建立乙個套接字 fd socket af inet,sock stream,0 以上指定了連線協議,socke...