Qt TcpSocket的掉線解決方法

一杯清酒邀明月發表於2024-03-14

1、 tcpip協議
  沒什麼好說的,號稱保證傳輸準確可靠,使命必達。協議很大一坨,實際應用上用得上的很少。

2 、問題所在
  在使用tcp協議跟伺服器連線後(分別測試過windows系統,ubuntu系統 微控制器帶tcpip協議的通訊模組)都發現不能及時反饋或反饋 網路已斷;(在同一個區域網內和公共網路上都一樣,起初懷疑會不會ubuntu系統的網路卡驅動有問題,後來發現windows系統也一樣,用的是wifi聯網)。最後只能說會不會是路由不是實時的。

3 、解決方法
  根據qt的說明文件是試錯,各種方法都用過;反正你把網線拔了,Qt 的tcpsocket類依然是沒有發現網路已斷,傳送依然是正常的。(本以為qt的這個類會比通用的tcp ip類會好點,一個鳥樣,至於keepalive的選項,statechange也不可用,會不會很多tcp伺服器也要使用keepalive的選項才能使用有效果,以後有時間試一下);現在解決方法有兩個: 1)使用心跳包方式;每秒傳送一次伺服器應答一次;很耗CPU資源;2)(推薦)在自己的傳送函式上socket_send(qbytedata msg)檢測qtcpsocket state的狀態,假如狀態不是connnected,就重新連線;因為在路由上接上目標ip的伺服器後,這邊  statechange才會生效(拔線或掉線不會生效)。

相關文章