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