最近在作一個udp升級程序,因文件有點大,須要將程序分紅多個包發送,每次發送一個包,收到回覆後發送下一個包,直到完成,這樣就控制爲順序發送,保證了完整性,簡單定義一個協議,每一個包,包含包編號,當前數據長度等信息算法
包頭 | 命令 | 子命令 | 總包數 | 包編號 | 總長度 | 當前包長度 | 校驗信息 | 數據 |
6byte | 1 | 1 | 1 | 1 | 4 | 4 | 2 | 0-1024 |
命令:290測試
子命令:發送開始爲 1 發送數據爲2 發送成功爲3(接收端發送給發送端) 發送失敗爲4spa
總包數: 文件分紅多少個包索引
包編號:當前發送的是第幾包(索引從0開始)ci
總長度:文件長度table
當前包長度:當前包的數據長度(《=1024)每次發送1024,最後一包可能少於1024循環
校驗信息:用計算是否丟包用,能夠用crc算法 ,這裏爲了簡單設置爲0udp
升級程序流程以下:程序
一、發送開始命令(發送端--》接收端)數據
二、傳輸數據(發送端收到接收端的第一個回覆後,而後發送第一個數據包,收到第2個回覆,而後發送的第3個包,如此循環,直到發送完成)
三、傳輸數據完成(接收端,收到全部包後,發送成功命令給發送端)
以上是處理思路,寫好代碼以後,測試ok,因設備太多 上1000臺,一個一我的工處理,太麻煩,想批量升級,修改代碼後,可使用,一次最多5臺,多了就會出現部分設備發送到一部分時就不成功。仔細檢查處理流程,並無發現任何錯誤,最後請同事幫忙看代碼,分析也沒有發現錯誤,抓包(Wireshark)分析後,有收到回覆包,也有發送數據,但就是中斷了,仔細分析後,猜想是接收緩衝區小(默認8192字節),設置接收緩衝區爲32k字節後,再試,能夠一次升級20多臺。
查找相關資料後,是因爲udp接收數據大於緩衝區時就會把數據丟掉。
分析緣由:一個數據包1k多,5臺接近8192,這就是爲何5臺時,很順利。
同理設置接收緩衝區爲32k後,就能夠升級20多了。
以上是思路整理,若是你也遇到這樣的狀況,或者對你有幫助,歡迎點贊、回覆。