【问题标题】:QTcpSocket connecting results in UnknownSocketError with errorString "UnknownError"QTcpSocket 连接导致 UnknownSocketError 错误字符串“UnknownError”
【发布时间】:2017-06-21 21:46:01
【问题描述】:

问题

我无法获得有关此错误的任何进一步信息:

QAbstractSocket::UnknownSocketError

QT QAbstractSocket::SocketError 仅提供了发生某些错误的基本解释

发生不明错误。

枚举值 = -1

调用 QTcpSocket::errorString() 可以提供:

"Unknown error"

在 SO 上有 one question 与此相关,但没有提供解决问题的真正解决方案(以及我所做的建议)

我完全不知道如何进一步处理此错误,因为每次我的客户端尝试连接(在调用 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"

有什么建议吗?

附言我找了一些堆栈跟踪/回溯选项,没有找到任何东西 - 如果有,请发表评论

【问题讨论】:

  • 编程中存在不同的错误,其中一些错误原因不明。有些错误只有通过检查代码逻辑才能发现。您也可以在这里输入MCVE,我们会尽力提供帮助
  • 另外new QTcpSocket(new QObject());的部分看起来很奇怪
  • @VladimirBershov 感谢您的建议。我已将其更改为new QTcpSocket(this),其中thisQDialog。而QDialog间接继承QObject
  • @VladimirBershov 这一变化导致结果没有差异。这个错误仍然存​​在我也认为这可能是一个问题,但似乎不是
  • @VladimirBershov 确实,当什么都没有发生时,在connectToHost() 之后检查error() 没有什么意义。我建议改为连接到error() 信号并在那里进行错误处理。

标签: qt sockets qtcpsocket qtcpserver qabstractsocket


【解决方案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();
}

【讨论】:

  • 谢谢你的建议,我有预感它可能是这样的,我会实施它并返回答案
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多