我有一個QTcpSocket,我正在讀入一個循環。每一個完整的數據包已經被閱讀,或出現了一個錯誤的時間,我手動檢查插座的狀態內循環,用:QTcpSocket狀態總是連接,甚至拔出以太網線
while(true){
if(socket->state()==QAbstractSocket::ConnectedState){
qDebug()<<"Socket status: connected. Looking for packets...";
if(socket->waitForReadyRead(2000)){
//...
}
當我執行德程序,一旦連接,並在循環開始,它總是打印qDebug()<<"Socket status: connected. Looking for packets..."
;然後在waitForReadyRead
找到一些數據準備好讀取。
問題是未檢測到斷開連接。如果我從操作系統選項中斷開與網絡的連接,或者即使拔出以太網線,它的行爲也是一樣的:套接字狀態等於QAbstractSocket::ConnectedStat
e,因此它繼續,但是沒有收到任何東西。
我也試圖檢測連接disconnected()
信號(拳頭連接之後)斷開到重新連接函數:
// Detect disconnection in order to reconnect
connect(socket, SIGNAL(disconnected()), this, SLOT(reconnect()));
void MyClass::reconnect(){
qDebug()<<"Signal DISCONNECTED emitted. Now trying to reconnect";
panelGUI->mostrarValueOffline();
socket->close();
prepareSocket((Global::directionIPSerialServer).toLocal8Bit().data(), 8008, socket);
qDebug()<<"Reconnected? Status: "<<socket->state();
}
但信號也決不emited,因爲從不執行該代碼。這是合乎邏輯的,因爲它看起來像套接字狀態總是ConnectedState
。
如果我再次插入,連接被恢復並開始再次接收數據,但我確實想要檢測斷開連接以在GUI顯示「斷開連接」。
爲什麼QTcpSocket的行爲如此,我該如何解決這個問題?
編輯:我在類的構造函數創建套接字,然後調用初始化函數prepareSocket:
socket = new QTcpSocket();
socket->moveToThread(this);
bool prepareSocket(QString address, int port, QTcpSocket *socket) {
socket->connectToHost(address, port);
if(!socket->waitForConnected(2000)){
qDebug()<<"Error creating socket: "<<socket->errorString();
sleep(1);
return false;
}
return true;
}
多久你與電纜拔出等待? – Mat
不知道... 10秒?對於POSIX套接字來說,確定它們已斷開連接是非常必要的。我應該等多少? –
TCP超時是遠遠高於此。至少等幾分鐘。 – Mat