各位大佬們,小弟遇到如下問題:
我再tcp客戶端使用信號readyread()觸發槽函式的方式接收資料,在傳輸資料時出現readall接收不到資料的問題。通過抓包可以看出資料已經都發過來了,但是我呼叫readall讀出的總位元組數與檔案位元組數對不上(使用分次讀取,程式內部快取資料)。有時候還會發現socket讀寫緩沖區都滿了,但是我這邊readall依舊讀不到資料,readyread也不繼續觸發了。 程式并沒有在whlie回圈中運行。
uj5u.com熱心網友回復:
通過wireshark抓包發現,當出現TCP window full時,即緩沖區滿時readall先接收很小的一段資料,然后readyread不會被觸發uj5u.com熱心網友回復:
可以先計算檔案的大小,等待接收夠了在停止回圈uj5u.com熱心網友回復:
我是通過事件回圈來收包,檔案大小的計算已經完成。關鍵是readall拿不到資料了uj5u.com熱心網友回復:
我之前遇到過類似的,你看看是不是一樣的情況:1、發送端發送完成500KB,
2、接收端收到readReady,于是我readAll,但是只能取到200多KB
最后我的解決方案:
1、發送端先發送需要發送的檔案大小
2、發送端發送檔案
3、接收端接收到檔案大小,將檔案大小fileSize全域保存;
4、接收端再次觸發readReady,判斷bytesAvailable(),如果小于FileSize,不讀取,直接退出函式,直到某次大小等于fileSize再read
uj5u.com熱心網友回復:
跟你的情況并不類似 因為我需要傳輸的檔案很大 比socket緩沖區要大 不可能像你那樣 不讀
我的處理是:有信號觸發就讀取,同樣檔案大小我也有保存,判斷讀取資料是否完成。但是我出現了以下情況:
資料未接收完,依舊在等待接收完整的資料,同樣我使用wireshark抓包看到的是資料已經發送給我了,并且資料量大的話會出現window full 也就是緩沖區滿了,但是我這邊readyread信號一直不觸發。我又在程式中設定了定時器,定時去readall()拿取資料,但是會一直readall拿到0位元組。
我懷疑是不是socket緩沖區滿了之后readyread信號就沒有觸發了。ps:程式沒有進入死回圈,信號槽觸發正常
uj5u.com熱心網友回復:
四樓 我不建議你 使用你說的第四點 資料沒到指定大小就不讀,你可以讀了先保存起來,因為 socket緩沖區經不起你這樣玩。uj5u.com熱心網友回復:
不會超的,我發送的也是幾G的檔案,也沒問題,我每次只發送500K,不會超過緩沖區限制,只有達到500K的時候我才讀uj5u.com熱心網友回復:
之前說錯了,不是判斷fileSize,是判斷每次發送的大小uj5u.com熱心網友回復:
每次發送前先發送本次發送資料的大小,我每次發500K,發送這次資料之前先把500K這個大小發過去,接收端沒存盤到500K之前不讀uj5u.com熱心網友回復:
說來也奇怪 我的代碼放到同事的電腦上可以完美運行 而我這邊會中斷出現上述問題。你那種方案是可取的,貌似可以規避掉我說的問題,現在我決定使用sftp去完成檔案的傳輸了。
我就是想搞懂出現我說的那個問題的原因,還是謝謝你的解答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/43945.html
標籤:Qt
上一篇:AndroidStudio報錯:Could not download gradle.jar:No cacahed version available for offline mode
