QTcpSocket 在 QTcpServer::nextPendingConnection() 之后获得 NULL

Posted

技术标签:

【中文标题】QTcpSocket 在 QTcpServer::nextPendingConnection() 之后获得 NULL【英文标题】:QTcpSocket gets NULL after QTcpServer::nextPendingConnection() 【发布时间】:2016-05-14 04:57:30 【问题描述】:

所以我这里有一个 QTcpServer(Qt 的 Fortune Server 示例的简化版)。它之前工作正常。然后我移动了一些东西并更改了一些代码。现在我的服务器在启动时崩溃了。据我所知,之后

tcpSocket = tcpServer->nextPendingConnection();

tcpSocket 保持 NULL。因此,像 tcpSocket->anyCall() 这样的所有调用都会导致段错误。应用程序输出显示:

QObject::connect: invalid null parameter

所以我的问题是,为什么 tcpServer->nextPendingConnection() 返回 NULL 突然之间,在我移动东西之前它工作得很好?

以下是我的代码的相关部分:

#include <QtWidgets>
#include <QtNetwork>
#include "server.h"

Server::Server(QWidget *parent)
: QDialog(parent), statusLabel(new QLabel), tcpServer(Q_NULLPTR), tcpSocket(Q_NULLPTR), networkSession(0), blockSize(0), userAuthenticated(false)

    QNetworkConfigurationManager manager;
    QNetworkConfiguration config = manager.defaultConfiguration();
    networkSession = new QNetworkSession(config, this);
    sessionOpened();

    ...
    // GUI stuff here //
    ...

    this->read_newClient();


void Server::sessionOpened()

    tcpServer = new QTcpServer(this);

    // some if else checks here //

    tcpSocket = tcpServer->nextPendingConnection(); // problem here //
    connect(tcpSocket, &QAbstractSocket::disconnected, tcpSocket, &QObject::deleteLater); // line that crashes //


void Server::read_newClient()

    QString data;
    if (!clientSocket->waitForReadyRead())
    
        qDebug() << "Cannot read";
        return;
    
    data = readData();

【问题讨论】:

【参考方案1】:

要使用 nextPendingConnection,您需要传入连接。因此,您有两种方法:

    连接到信号newConnection():

    ...
    connect(tcpServer, &QTcpServer::newConnection, this, &Server::OnNewConnection);
    ...
    void Server::OnNewConnection() 
        if (tcpServer->hasPendingConnections()) 
            tcpSocket = tcpServer->nextPendingConnection();
            connect(tcpSocket, &QAbstractSocket::disconnected, tcpSocket, QObject::deleteLater);
        
    
    

    或者使用阻塞调用waitForNewConnection():

    if (tcpServer->waitForNewConnection()) 
        if (tcpServer->hasPendingConnections()) 
            tcpSocket = tcpServer->nextPendingConnection();
            connect(tcpSocket, &QAbstractSocket::disconnected, tcpSocket, QObject::deleteLater);
        
    
    

别忘了拨打tcpServer-&gt;listen();

【讨论】:

感谢您的回答。顺便说一句,我不明白您的 connect 调用的最后一个参数。另外,我错过了 networkSession->open(); @Deedaus QTcpServer 可以独立于networkSession运行。 那么整个包含 manager、config 和 networkSession 的部分都可以去掉吗?为什么他们在财富的例子中使用它? @Deedaus 在 Fortune 示例中,它们还说明了使用网络配置(保存、读取)的操作。但 QTcpServer 的最小示例:pastebin.com/WCVsNCS5

以上是关于QTcpSocket 在 QTcpServer::nextPendingConnection() 之后获得 NULL的主要内容,如果未能解决你的问题,请参考以下文章

不能让 QTcpSocket/QTcpServer 一起工作

Qt creator 找不到,QTcpServer 和 QTcpSocket

使用 QTcpSocket 和 QTcpServer 进行控制台聊天

QTcpSocket false 连接到 QTcpServer

Qt基础之三十四:QTcpSocket和QTcpServer源码分析

如何安全地删除 QT::QTcpSocket?