У меня есть QTcpSocket, и я читаю в петля.Каждый раз, когда считывается полный пакет или возникает ошибка, я вручную проверяю состояние сокета внутри цикла с помощью:
while(true){
if(socket->state()==QAbstractSocket::ConnectedState){
qDebug()<<"Socket status: connected. Looking for packets...";
if(socket->waitForReadyRead(2000)){
//...
}
Когда я запускаю программу de, после подключения и запуска цикла, она всегда печатает qDebug()<<"Статус сокета: подключен. Ищем пакеты..."
; а затем зависает на waitForReadyRead
до тех пор, пока некоторые данные не будут готовы для чтения.
Проблема в том, что разъединения не обнаруживаются. Если я отключаюсь от сети из опций ОС или даже если я отключаю провод Ethernet, он ведет себя так же: состояние сокета равно QAbstractSocket::ConnectedStat
e, поэтому он продолжается, но, конечно, ничего не получает. .
Я также пытался обнаружить разъединения, соединяющие сигнал disabled()
(после первого соединения) с функцией повторного подключения:
// 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
.
Если я снова подключаюсь, соединение восстанавливается и снова начинает получать данные, но я хочу обнаруживать разъединения, чтобы отображать «Отключено» в графическом интерфейсе.
Почему 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;
}