網路收發之cycleBuf

2021-09-06 16:46:56 字數 3040 閱讀 7029

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...