Состояние QTcpSocket всегда подключено, даже при отключении кабеля Ethernet

У меня есть QTcpSocket, и я читаю в петля.Каждый раз, когда считывается полный пакет или возникает ошибка, я вручную проверяю состояние сокета внутри цикла с помощью:

    while(true){
    if(socket->state()==QAbstractSocket::ConnectedState){
        qDebug()<<"Socket status: connected. Looking for packets...";
        if(socket->waitForReadyRead(2000)){
        //...
    }

Когда я запускаю программу de, после подключения и запуска цикла, она всегда печатает qDebug()<<"Статус сокета: подключен. Ищем пакеты..."; а затем зависает на waitForReadyReadдо тех пор, пока некоторые данные не будут готовы для чтения.

Проблема в том, что разъединения не обнаруживаются. Если я отключаюсь от сети из опций ОС или даже если я отключаю провод Ethernet, он ведет себя так же: состояние сокета равно QAbstractSocket::ConnectedState, поэтому он продолжается, но, конечно, ничего не получает. .

Я также пытался обнаружить разъединения, соединяющие сигнал 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;
}
25
задан Chilledrat 4 May 2012 в 20:41
поделиться