Socket程式設計注意接收緩衝區大小

ITBread發表於2014-08-20

最近在做一個udp升級程式,因檔案有點大,需要將程式分成多個包傳送,每次傳送一個包,收到回覆後傳送下一個包,直到完成,這樣就控制為順序傳送,保證了完整性,簡單定義一個協議,每個包,包含包編號,當前資料長度等資訊

包頭 命令 子命令 總包數 包編號 總長度 當前包長度 校驗資訊 資料
6byte 1 1 1 1 4 4 2 0-1024

命令:290

子命令:傳送開始為 1   傳送資料為2  傳送成功為3(接收端傳送給傳送端)  傳送失敗為4

總包數: 檔案分成多少個包

包編號:當前傳送的是第幾包(索引從0開始)

總長度:檔案長度

當前包長度:當前包的資料長度(《=1024)每次傳送1024,最後一包可能少於1024

校驗資訊:用計算是否丟包用,可以用crc演算法 ,這裡為了簡單設定為0

升級程式流程如下:

1、傳送開始命令(傳送端--》接收端)

2、傳輸資料(傳送端收到接收端的第一個回覆後,然後傳送第一個資料包,收到第2個回覆,然後傳送的第3個包,如此迴圈,直到傳送完成)

3、傳輸資料完成(接收端,收到所有包後,傳送成功命令給傳送端)

以上是處理思路,寫好程式碼之後,測試ok,因裝置太多 上1000臺,一個一個人工處理,太麻煩,想批量升級,修改程式碼後,可以使用,一次最多5臺,多了就會出現部分裝置傳送到一部分時就不成功。仔細檢查處理流程,並沒有發現任何錯誤,最後請同事幫忙看程式碼,分析也沒有發現錯誤,抓包(Wireshark)分析後,有收到回覆包,也有傳送資料,但就是中斷了,仔細分析後,猜測是接收緩衝區小(預設8192位元組),設定接收緩衝區為32k位元組後,再試,可以一次升級20多臺。

查詢相關資料後,是由於udp接收資料大於緩衝區時就會把資料丟掉。

分析原因:一個資料包1k多,5臺接近8192,這就是為什麼5臺時,很順利。

同理設定接收緩衝區為32k後,就可以升級20多了。

以上是思路整理,如果你也遇到這樣的情況,或者對你有幫助,歡迎點贊、回覆。

相關文章