2016-07-17 6 views
0

私はSSLを介してツイッチチャットサーバーに接続しようとしています。基本的にQTのセキュアSSL接続の例のコードをコピーして貼り付けました。私がconnectToHostEncryptedできるとき、それはすべてクラッシュした。すべてのヘルプは大Qt QSSlSocket - SEGFAULT on 'connectToHostEncrypted();'

を高く評価され

相対コード:

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!"); 
} 

宣言:

Public: 
QSslSocket *socket: 
+0

'MainWindow'コンストラクタで' socket'が 'nullptr'に初期化されていますか? –

+0

@ G.M。私はコードを編集しました。見てみましょう。 –

+0

しかし、あなたは* 'socket'をどこで初期化しますか? 'nullptr'に初期化しておかないと、' MainWindow :: secureConnect'が呼び出されたときに、一般的にはnullでない値がありますが、 'if(!socket){'は失敗します。実際には新しい 'QSslSocket'を作成することはありません。投稿を更新して、 'MainWindow'コンストラクタのコードを表示できますか? –

答えて

1

私は私が私のポイントを得ることができたかわからないような答えとしてこれを置く コメントの向こうに。

あなたはクラスsocketを持つクラスMainWindowがあります。あなたはnullptrsocketを初期化しない場合は...のは、それは...

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

だとしましょう、私は何かのように見えるために、コンストラクタの実装を期待最小限に

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

物事を維持MainWindow::secureConnectが呼び出される前に、それはいくつかのランダムな値を持ちます。

if (!socket) { 

...その場合には

socket = new QSslSocket(this); 

が実行されることはありません...ブロックを含むことを意味失敗します。テストのところで

は、デバッガの下で、あなたのコードを実行することができ、行にブレークポイントを設定し...

if (!socket) { 

socketの値を確認してください。その行が最初にヒットするのはsocketです。それは...ですか?

+0

ああ、実際に私は 'MainWindow :: MainWindow(QWidget * parent): QMainWindow(親)、 ui(新しいUi :: MainWindow)、socket(0)'を追加したことを忘れていましたが、 'QAbstractSocket :: connectToHost()は、 "irc.chat.twitch.tv"を参照または接続/接続しているときに呼び出されました。 '私の変更を' secureConnect() '関数で表示するようにコードを更新しました。 –

+0

これは、同じインスタンスに対して 'MainWindow :: secureConnect'を複数回呼び出すことを示唆しています。申し訳ありませんが、あなたは本当にあなたのデザインについてもう少し考える必要があります。 –

+0

このデザインはQTの例からコピーされました.... –