У меня есть 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..."
; а затем stacks на waitForReadyRead
, пока некоторые данные не будут готовы к чтению.
Проблема заключается в том, что разъединения не обнаружены. Если я отключусь от сети из опций ОС, или даже если я отключу провод Ethernet, он будет вести себя одинаково: состояние Socket равно 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();
}
Но сигнал никогда не испускается, потому что этот код никогда не выполняется. Это логично, поскольку он выглядит как состояние сокета всегда ConnectedState
.
Если я снова подключаюсь, соединение восстанавливается и снова начинает получать данные, но я хочу обнаружить отключения, чтобы показать "Disconnected" в графическом интерфейсе.
Почему QTcpSocket ведет себя таким образом и как я могу решить эту проблему?
EDIT: я создаю сокет в конструкторе класса, а затем инициализируя вызов функции 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;
}