這個項目是寫一個利用TCP來傳輸.bin的並文件,接收端是將接收到的.bin並文件直接在串口助手中進行讀取。
但是從讀取的結果來看發現傳輸過來得數據是錯誤的,與原數據不相符,由於服務端是直接對並文件在串口助手中顯示,一開始認為直接讀取的數據可能先把一些包的文件說明讀了讀了出來,導致文件里面的正確數據沒有正常的讀取出來。
后來發現並不是傳輸一開始有問題,而是在接受過程中是有問題的。
這里就發現了QT的TCP傳輸機制,它將我的數據分兩次接收,每一次是原來的一半。
例如我傳3000字節大小,那么它會拆成兩次1500,偶爾會出現2966和44或者一次滿包的情況。
隨着你傳輸數據越大,能一次性滿包的概率越小。
我在項目里用的是readAll函數,並沒有找到QT函數中能阻塞式接收指定數據大小的函數。
當然了數據過大會分包,數據過小的頻繁傳輸會粘包。
又或者因為兩次傳輸的時間分隔比較小,所以導致redyread只觸發一次的問題都有可能遇到。
關於上述分包的解決辦法是因為我知道數據包一次傳輸的大小。
所以再readAll后立即判斷buff. size()的大小是否大於一次傳輸的大小 即>=3000
不是的話吧buff賦值給全局變量 第二次出發radyread信號 再通過append來拼接兩個或者三個包。