2016-03-30 11 views
0

自分自身に「接続」してデータを送信する簡単なプログラムを作成しています。それはQTcpServerを起動して、入ってくる接続を待ちます。私は別の機能を持っていますが、これはローカルホストとポートでこのサーバーに接続しようとします。これはコマンドプロンプトでTelnetを開いたときに動作しますが、実際のプログラムでは動作します。QT QTcpServerが時間内に接続していません

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    server = new QTcpServer(this); 
    //Initialize and start the server 
    connect(server, SIGNAL(newConnection()), this, SLOT(newConnection())); 
    if (!server->listen(QHostAddress::Any, 3665)) 
    { 
     qDebug() << "Server failed to start!"; 
    } 
    else 
    { 
     qDebug() << "Server started"; 
    } 
    //Try to connect to the server 
    connectToServer("127.0.0.1", qint16(3665)); 
} 

MainWindow::~MainWindow() 
{ 
    delete server; 
    delete ui; 
} 

void MainWindow::connectToServer(QString host, qint16 port) 
{ 
    qDebug() << "Connecting to " + host + " at port " + QString::number(port); 
    QTcpSocket socket; 
    socket.connectToHost(host, port); 
    if (!socket.waitForConnected(5000)) 
    { 
     qDebug() << socket.errorString(); 
    } 
    while (socket.bytesAvailable() < (int)sizeof(quint16)) 
    { 
     if (!socket.waitForReadyRead(5000)) 
     { 
      qDebug() << socket.errorString(); 
     } 
    } 
    quint16 blockSize; 
    QDataStream in(&socket); 
    in.setVersion(QDataStream::Qt_5_5); 
    in >> blockSize; 
    while (socket.bytesAvailable() < blockSize) 
    { 
     if (!socket.waitForReadyRead(5000)) 
     { 
      qDebug() << socket.errorString(); 
     } 
    } 
    QString fortune; 
    in >> fortune; 
    qDebug() << fortune; 
} 

void MainWindow::newConnection() 
{ 
    qDebug() << "A connection has been found."; 
    QTcpSocket *socket = server->nextPendingConnection(); 

    socket->write("hello client\r\n"); 
    socket->flush(); 
    socket->waitForBytesWritten(5000); 
    socket->close(); 
} 
+0

@KubaOber大丈夫です!私はそれに取り組んでいきます。プログラムにエラーが発生したときにリターンを追加したときに私は困惑し、connect関数が終了した後も新しい接続があったことが検出されました。 –

+1

コールをブロックする代わりにイベントを使用する必要があります(waitFor ...)。例については、https://www.ics.com/files/qtdocs/network-http.htmlを参照してください。 – o9000

+1

確かにシグナルは私が意味していたものです:) – o9000

答えて

1

あなたの問題の原因は、ほとんどの場合、擬似同期混乱がwaitFor方法によって引き起こされる:ここで私が使用したコード(いくつかは他のソースからの抜粋です)

MainWindow.cppです。それらを取り除く。さらに、readyReadで受信するバイト数については保証されません。一度に1バイト、場合によっては実際に任意のバイト数を受け取るのは正常です。あなたのコードはそれに対処しなければなりません。

Thisは、そのようなアプローチの1つの例です。これは、非同期的にしたいものです。 Thatは、読みやすく、宣言的な構文を使用して、非同期通信コードを書き込むために状態マシンを活用する方法を示す別の例です。

関連する問題