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

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

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

相關文章
相關標籤/搜索