QTcpSocket показал сетевую ошибку, но ping пропущен - PullRequest
0 голосов
/ 06 декабря 2018

Я установил соединение с устройством через qtcpsocket.Кстати работаю в операционной системе Windows 10.Брандмауэр и защита Windows были отключены, когда я подключился к хосту, соединение прошло.Метод errorString выдал мне неизвестную ошибку, которая означает, что ничего страшного не произошло, но со временем он испустил сигнал socketError со значением QAbstractSocket :: NetworkError (0x0007), что означает «В сети произошла ошибка (например, сетевой кабель был случайноотключен)Пинг с устройством пропущен, но когда я пытаюсь подключиться к нему, через некоторое время я получаю сигнал об ошибке.

Где основная проблема в моем программном обеспечении или операционной системе?Как я могу это проверить?

См. Весь код ниже:

// Get model of message for option
TcpConnectMessageModel *messageModel = dynamic_cast<TcpConnectMessageModel *>(_messageModel);
if (messageModel == nullptr)
{
    systemMessagesController->SendConnectResultMessage(deviceName, ConnectResult::WrongConnectMessage, errors);
    break;
}

// initializing data for connection
options = messageModel->GetOptions(message);
bool ok = false;           

// create socket and connect it with hostAddress и ip:
senderSocket = QTcpSocketPtr(new QTcpSocket());



// when connection succesful
if(!connect(senderSocket.data(), &QTcpSocket::connected,this, [=](){
            qDebug() << "Connect success" << "!" << senderSocket->errorString();
            systemMessagesController->SendConnectResultMessage(deviceName, ConnectResult::Success, errors);
            connected = true;
    }))
{
    errors << senderSocket->errorString();

    systemMessagesController->SendConnectResultMessage(deviceName, ConnectResult::WrongConnectMessage, errors);
}

//connected = true;
if(!connect(senderSocket.data(), QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
    [=](QAbstractSocket::SocketError socketError){
            QString tmp = senderSocket->errorString();
            //errors << tmp;
            systemMessagesController->SendDisconnectResultMessage(deviceName, DisconnectResult::Error, errors);
    }))
{
    errors << senderSocket->errorString();
    systemMessagesController->SendConnectResultMessage(deviceName, ConnectResult::WrongConnectMessage, errors);
    break;
}

// stop socket when disconnect received 
if(!connect(this, &TcpLinkAgent::finished,this, [=](){
            if(!connected) return;
            senderSocket->close();
            qDebug() << "disconnected success" << "!" << senderSocket->errorString();                        
            disconnect(senderSocket.data(), 0, 0, 0);                        
            // socket turned off succesfully:
            if (senderSocket->openMode() == QIODevice::NotOpen)
            {
                systemMessagesController->SendDisconnectResultMessage(deviceName, DisconnectResult::Success, errors);                            
                senderSocket.reset();
                connected = false;
            }
            else
            {
                QStringList errors;
                systemMessagesController->SendDisconnectResultMessage(deviceName, DisconnectResult::Error, errors);                            
            }
    }))
{
    errors << senderSocket->errorString();
    systemMessagesController->SendConnectResultMessage(deviceName, ConnectResult::WrongConnectMessage, errors);                
    break;
}


if (!connect(senderSocket.data(), &QTcpSocket::readyRead, this, &TcpLinkAgent::DataReadyHandler, Qt::ConnectionType::QueuedConnection))
{
    systemMessagesController->SendConnectResultMessage(deviceName, ConnectResult::WrongConnectMessage, errors);
    break;
}

senderSocket->connectToHost(QHostAddress(options.ip), options.port.toUInt());
//This lines showed that all ok.
QString tmp = senderSocket->errorString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...