我有一个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::ConnectedState
,所以继续运行,但当然不会接收任何东西。我还尝试通过将
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();
}
但是信号从未被发射,因为这段代码从未被执行。这很合理,因为套接字状态似乎始终是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;
}