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();
}
@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. –
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
In der Tat Signale ist was ich meinte :) – o9000