Socket編程注意接收緩沖區大小


最近在做一個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多了。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM