2016-07-17 7 views
0

Ich versuche, mich über SSL mit dem Twitch-Chat-Server zu verbinden, und habe im Prinzip Code aus dem Beispiel Secure SSL Connection in QT kopiert und eingefügt. Wenn ich kann connectToHostEncrypted alles abgestürzt ist. Jede Hilfe wird sehr geschätztQt QSSlSocket - SEGFAULT auf 'connectToHostEncrypted();'

Relative Code:

void MainWindow::secureConnect() 
{ 
    if (!socket) { 
     socket = new QSslSocket(this); 
     connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), 
       this, SLOT(socketStateChanged(QAbstractSocket::SocketState))); 

    connect(socket, SIGNAL(encrypted()), 
      this, SLOT(socketEncrypted())); 

    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), 
      this, SLOT(socketError(QAbstractSocket::SocketError))); 

    connect(socket, SIGNAL(sslErrors(QList<QSslError>)), 
      this, SLOT(sslErrors(QList<QSslError>))); 

    connect(socket, SIGNAL(readyRead()), 
      this, SLOT(socketReadyRead())); 
    } 
    qDebug() << 2; 
    socket->connectToHostEncrypted("irc.chat.twitch.tv", 443); 
    QEventLoop loop; 
    connect(socket, SIGNAL(connected()), &loop, SLOT(quit())); 
    loop.exec(); 
    qDebug() << 5; 
    sendData("PASS oauth:" + TwitchAccessToken); 
    sendData("NICK ThatRedstoneGT"); 
    sendData("JOIN smartguy316"); 
    sendData("PRIVMSG Hello!"); 
} 

Erklärung:

Public: 
QSslSocket *socket: 
+0

Ist 'socket' im' MainWindow' Konstruktor auf 'nullptr' initialisiert? –

+0

@ G.M. Ich habe den Code bearbeitet. Geh und sieh es dir an. –

+0

Aber wo initialisierst du Socket? Wenn Sie es nicht irgendwo mit 'nullptr' initialisieren, dann wird es, wenn 'MainWindow :: secureConnect' aufgerufen wird, im Allgemeinen einen Nicht-Null-Wert haben, in welchem ​​Fall' if (! Socket) {'fehlschlägt und Sie werden Erstellen Sie niemals einen neuen 'QSslSocket'. Können Sie den Post aktualisieren, um den Code für den 'MainWindow'-Konstruktor anzuzeigen. –

Antwort

1

Putting dies als eine Antwort, wie ich bin nicht sicher, ich habe es geschafft, meinen Standpunkt zu bekommen in den Kommentaren.

Sie haben eine Klasse MainWindow mit einem Mitglied socket. Halten Sie die Dinge auf ein Minimum lassen Sie uns sagen, dass es ...

class MainWindow { 
public: 
    MainWindow(); 
    void secureConnect(); 
    void sendData(QString text); 
    QSslSocket *socket: 
}; 

Jetzt möchte ich den Konstruktor Implementierung erwarten etwas aussehen ...

MainWindow::MainWindow() 
    : socket(nullptr) 
    {} 

Wenn Sie nicht initialisieren socket-nullptrbevorMainWindow::secureConnect aufgerufen wird, dann wird es einen zufälligen Wert haben. In diesem Fall ...

if (!socket) { 

wird bedeutet nicht, dass der Satz mit ...

socket = new QSslSocket(this); 

wird nie ausgeführt werden.

Durch einen Test können Sie Ihren Code unter einem Debugger ausführen, um einen Haltepunkt auf der Linie setzen ...

if (!socket) { 

und den Wert von socket überprüfen. Das erste Mal, dass die Zeile socket erreicht wird, sollte null sein. Ist es?

+0

Oh ich sehe, eigentlich habe ich vermisst, dass ich 'MainWindow :: MainWindow (QWidget * Eltern) hinzugefügt: QMainWindow (Eltern), UI (neue Ui :: MainWindow), Socket (0)' Aber es sagt, dass 'QAbstractSocket :: connectToHost() aufgerufen, wenn bereits nachgeschlagen oder verbunden/verbunden mit "irc.chat.twitch.tv" 'Ich habe meinen Code aktualisiert, um meine Änderungen in der' secureConnect() 'Funktion anzuzeigen. –

+0

Das deutet darauf hin, dass Sie 'MainWindow :: secureConnect' mehr als einmal für dieselbe Instanz aufrufen. Entschuldigung, aber Sie müssen wirklich über Ihr Design ein bisschen mehr nachdenken. –

+0

Dieser Entwurf wurde von QT-Beispiel für Ihre Information kopiert. –