2016-05-14 15 views
0

Also habe ich einen QTcpServer hier (vereinfachte Version von Qt's Fortune Server Beispiel). Es hat früher gut funktioniert. Dann habe ich ein paar Dinge bewegt und einen Code geändert. Jetzt stürzt mein Server beim Start ab. Soweit ich das beurteilen kann, nachdemQTcpSocket wird NULL nach QTcpServer :: nextPendingConnection()

tcpSocket = tcpServer->nextPendingConnection(); 

TCPSocket bleibt NULL. Daher werden alle Anrufe wie tcpSocket-> anyCall() einen Seg-Fehler verursachen. Anwendungs ​​Ausgabe zeigt:

QObject::connect: invalid null parameter 

Also meine Frage ist, warum ist tcpServer-> nextPendingConnection() Rückkehr NULL ganz plötzlich, wenn, bevor ich Dinge bewegt um es funktionierte gut?

Hier sind die relevanten Teile meines Code:

#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(); 
} 

Antwort

3

nextPendingConnection nutzen zu können, müssen Verbindung incomming. Daher gibt es zwei Möglichkeiten:

  1. Connect zu signalisieren NewConnection():

    ... 
    connect(tcpServer, &QTcpServer::newConnection, this, &Server::OnNewConnection); 
    ... 
    void Server::OnNewConnection() { 
        if (tcpServer->hasPendingConnections()) { 
         tcpSocket = tcpServer->nextPendingConnection(); 
         connect(tcpSocket, &QAbstractSocket::disconnected, tcpSocket, QObject::deleteLater); 
        } 
    } 
    
  2. oder benutzen blockierenden Aufruf waitForNewConnection():

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

Rufen Sie nicht vergessen tcpServer->listen();

+0

Danke für Deine Antwort. Übrigens habe ich das letzte Argument deines Verbindungsaufrufs nicht verstanden. Außerdem fehlte mir networkSession-> open(); – DDauS

+0

@Deedaus Herausgegeben –

+0

@Deedaus QTcpServer kann unabhängig von NetworkSession arbeiten. –