Соединение QTcpSocket приводит к UnknownSocketError с errorString UnknownError

Проблема

Я не могу получить дополнительную информацию об этой ошибке:

QAbstractSocket::UnknownSocketError

QT QAbstractSocket::SocketError дает только базовое объяснение того, что произошла какая-то ошибка

Произошла неизвестная ошибка.

перечисляемое значение = -1

Вызов QTcpSocket::errorString() дает следующее:

"Unknown error"

Существует один вопрос относительно этого здесь, на SO, но не дает реального решения проблемы (и что было предложено, я сделал )

Я совершенно не знаю, как дальше работать с этой ошибкой, поскольку каждый раз, когда мой клиент пытается подключиться (после вызова connectToHost()) Я получаю эту ошибку.

Код:

//Сервер

//...
if (tcpServer.listen(QHostAddress().AnyIPv4, 5000)) {
    qDebug() << "tcpserver started on port : 5000";
}
else{
    qDebug() << "tcpserver failed to start";
}
//...

Я также явно установил IP-адрес сервера на localhost и порт 5000, но безуспешно.

//Клиент

//...
tcp_con = new QTcpSocket(new QObject());
tcp_con->connectToHost("127.0.0.1", 5000);

switch (tcp_con->error()) {
    //...
    case QAbstractSocket::UnknownSocketError:
    qDebug() << "tcp error UnknownSocketError closed : " << tcp_con->errorString();
    return;
    //...
}

Вывод отладки клиента:

tcp error UnknownSocketError closed :  "Unknown error"

Любой совет?

пс. Я искал какую-нибудь опцию stacktrace/backtrace, ничего не нашел — если есть, оставьте комментарий


person CybeX    schedule 04.02.2017    source источник
comment
В программировании бывают разные ошибки, и о причине некоторых из них ничего не известно. Некоторые ошибки можно найти, только проверив логику кода. Также вы можете разместить здесь MCVE, и мы постараемся помочь   -  person Vladimir Bershov    schedule 04.02.2017
comment
Также часть new QTcpSocket(new QObject()); выглядит странно   -  person Vladimir Bershov    schedule 04.02.2017
comment
@VladimirBershov спасибо за предложение. Я изменил это на new QTcpSocket(this), где this — это QDialog. И QDialog косвенно наследует QObject.   -  person CybeX    schedule 04.02.2017
comment
@VladimirBershov это изменение не повлияло на результат. Эта ошибка сохраняется p.s. Я тоже думал, что это может быть проблемой, но похоже, что это не так   -  person CybeX    schedule 04.02.2017
comment
как насчет MCVE и как насчет QAbstractSocket::waitForConnected для tcp_con переменная   -  person Vladimir Bershov    schedule 04.02.2017
comment
@VladimirBershov действительно, нет смысла проверять error() сразу после connectToHost(), когда еще ничего не произошло. Вместо этого я бы рекомендовал подключиться к сигналу error() и выполнить там обработку ошибок.   -  person Kevin Krammer    schedule 05.02.2017
comment
@KevinKrammer спасибо за это предложение, оно имеет гораздо больше смысла. тоже буду реализовывать   -  person CybeX    schedule 05.02.2017


Ответы (1)


Неправильно проверять ошибку сразу после connectToHost(), потому что это не полное действие, а errorString() всегда будет возвращать "Неизвестная ошибка". Вы должны вызвать метод QAbstractSocket::waitForConnected() следующим образом :

tcp_con->connectToHost("127.0.0.1", 5000);
if (tcp_con->waitForConnected(1000))
    qDebug("Connected!");

Или вы можете не вызывать waitForConnected() и асинхронно ждать, пока сигнал connected() будет выдано:

connect(tcp_con, SIGNAL(error(QAbstractSocket::SocketError)),
        this, SLOT(onError(QAbstractSocket::SocketError)));
    connect(tcp_con, SIGNAL(connected()),
        this, SLOT(onConnect()));
//...
void MyClass::onConnect()
{
    qDebug() << "Connected!";
}

void MyClass::onError(QAbstractSocket::SocketError)
{  
    QTcpSocket* sock = (QTcpSocket*)sender();
    qDebug() << "Socket error:" << sock->errorString();
}
person Vladimir Bershov    schedule 05.02.2017
comment
Спасибо за это предложение, у меня было предчувствие, что это может быть что-то вроде этого, я реализую его и вернусь с ответом. - person CybeX; 05.02.2017