2016-03-30 24 views
0

Ich mache ein einfaches Programm, das sich mit sich selbst verbindet und dann Daten sendet. Es startet einen QTcpServer und wartet dann auf alle eingehenden Verbindungen. Ich habe eine separate Funktion, die wiederum versuchen wird, eine Verbindung zu diesem Server am Localhost und Port, den ich beschlossen habe, zu versuchen. Dies funktioniert, wenn ich Telnet in der Eingabeaufforderung öffne, aber jetzt in meinem eigentlichen Programm. Hier ist der Code, den ich verwenden (Einige sind Ausschnitte aus anderen Quellen)QT QTcpServer verbindet sich nicht

mainwindow.cpp:

#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 in Ordnung! Ich werde daran arbeiten. Ich war ratlos, als ich Return (s) hinzufügte, als das Programm Fehler bekam, und nachdem die Verbindungsfunktion beendet wurde, stellte es immer noch fest, dass eine neue Verbindung bestand. –

+1

Sie müssen Ereignisse verwenden, anstatt Anrufe zu blockieren (waitFor ...). Ein Beispiel finden Sie unter https://www.ics.com/files/qtdocs/network-http.html. – o9000

+1

In der Tat Signale ist was ich meinte :) – o9000

Antwort

1

Die Ursache des Problems ist, höchstwahrscheinlich, das pseudo-synchrone Chaos durch waitFor Methoden verursacht. Sie loswerden. Außerdem können Sie nicht garantieren, wie viele Bytes Sie unter readyRead erhalten: Es ist völlig normal, unter bestimmten Umständen ein Byte zu einer Zeit zu empfangen, oder tatsächlich eine beliebige Anzahl von Bytes, einschließlich mehr Bytes, als Sie vielleicht erwarten. Dein Code muss damit umgehen.

This ist ein Beispiel für einen solchen Ansatz - es macht was Sie wollen, asynchron. That ist ein weiteres Beispiel, das zeigt, wie State-Maschinen verwendet werden können, um asynchronen Kommunikationscode mithilfe einer einfach zu lesenden deklarativen Syntax zu schreiben.

Verwandte Themen