最近在做一個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多了。
以上是思路整理,如果你也遇到這樣的情況,或者對你有幫助,歡迎點贊、回覆。